の値f1
との値はd2
両方ともまったく同じ数値を表します。その数は正確には42.480000ではなく、正確には42.479999542236328でもありませんが、終了する10進表現があります。floatを表示する場合、デバッグビューはfloatの精度で適切に丸められ、doubleを表示する場合はdoubleの精度で丸められます。したがって、変換してdoubleとして表示すると、ミステリー値の約2倍の有効数字が表示されます。
d1
には、ミステリー値よりも4.48に近い近似値がd1
含まれています。これは、4.48に最も近いdoubleが含まれているのに対しf1
、 4.48にd2
最も近いfloat値のみが含まれているためです。何がd2
含まれると思いましたか?f1は、それが「実際にあるはず」4.48であることを「記憶」できないため、doubleに変換すると、「より正確」になります。
それを回避する方法は、あなたが意味する深刻な数値問題によって異なります。問題がd1とd2が等しく比較されないことであり、それらが等しくなるはずだと思う場合、答えは、比較に小さな許容値を含めることです。たとえば、次のように置き換えd1 == d2
ます。
fabs(d1 - d2) <= (d2 * FLT_EPSILON)
これはほんの一例ですが、このケースを扱っているかどうかは確認していません。自分に合った許容誤差を選択する必要があります。また、多くのエッジケースについても心配する必要があります。d2はゼロである可能性があり、値は無限大またはNaNである可能性があり、その他の場合もあります。
問題が、d2が正確な結果を生成するためのアルゴリズムにとって十分に正確な値ではないことである場合は、float
値を回避するか、より数値的に安定したアルゴリズムを使用する必要があります。