为什么(0.0006*100000)%10是10

lij*_*050 3 c++ python floating-point floating-accuracy modulus

当我在python中执行(0.0006*100000)%10和(0.0003*100000)%10时,它分别返回9.999999999999993,但实际上它必须为0.类似地,在c ++中,fmod(0.0003*100000,10)给出的值为10.有人可以帮我解决我出错的地方.

Pat*_*han 10

最接近的IEEE 754 64位二进制数为0.0003是0.0002999999999999999737189393389513725196593441069126129150390625.将其乘以100000的结果的最接近的可表示数字是29.999999999999996447286321199499070644378662109375.

有许多操作,例如floor和mod,可以使非常低的显着性差异非常明显.您需要小心使用它们与浮点数相关联 - 请记住,在许多情况下,您对无限精度值有一个非常非常接近的近似值,而不是无限精度值本身.实际值可能略高,或者在这种情况下略低.


Jam*_*nze 5

只是给出明显的答案:0.00060.0003不能在机器双精度中表示(至少在现代机器上)。所以你实际上并没有乘以这些值,而是乘以某个非常接近的值。稍微多一点,或者稍微少一点,取决于编译器如何舍入它们。