我有一个打印为0.000000
的double
,并尝试与0.0f
进行比较,但未成功。这里为什么会有差异?最可靠的方法是确定你的double
是否为零?
我有一个打印为0.000000
的double
,并尝试与0.0f
进行比较,但未成功。这里为什么会有差异?最可靠的方法是确定你的double
是否为零?
为了确定其是否足够接近零,以便在六位小数的情况下打印为0.000000
,可以使用以下方法:
fabs(d) < 0.0000005
在一般情况下,处理浮点数计算中的小误差可能会变得非常复杂。
如果您想更好地了解自己得到的值,请尝试使用%g
而不是%f
进行打印。
DBL_MIN
是可表示的最小浮点数,那么检查是否小于它有什么意义? - Greg HewgillDBL_MIN
是最小的规格化双精度值,实现可能支持比它更小的非规格化值。 - Steve JessopDBL_MIN
非常小,不多计算都有误差,都会非常接近。有时候,DBL_EPSILON
乘以计算中数字的数量是很好的选择。使用%g
,即使是精确的双精度值0.0
也不会打印为0.000000
,我认为任何值都不会。所以我不知道确切的问题是什么,这是我最好的猜测,%f
。 - Steve Jessop您可以使用范围表达式。比如 -0.00001 <= x <= 0.00001。
x=-0.00002;
或x=5e-6;
。 - dmckee --- ex-moderator kittenbool areDifferent(float a, float b) {
if (a == b) return false; // Or also: if ((a - b) == FLT_MIN)
return true;
}
// What is the output of areDifferent(val, val + FLT_MIN * 0.5f) ?
// true, not false, even if adding half the "minimum value".
float getInverse(float a, float b) {
if (a != b)
return 1.0f / (a-b); // With denormals disabled, a != b can be true, but (a - b) can still be denormals, it'll rounded to 0 and throw the exception
return FLT_MAX;
}