当y是整数时,fmod()是否准确?
在使用double fmod(double x, double y)
且y
是整数时,结果似乎总是精确的。
(这是一个完整的数字,在这里不是int
。)
也许C 不需要 fmod()
在这些选择的情况下提供精确的答案,但是在我尝试过的编译器上,结果是准确的,即使x/y
的商不能完全表示。
- 当
y
是整数时,是否期望得到确切的答案? - 如果没有,请提供一个反例。
例子:
double x = 1e10; // x = 10000000000 printf("%.50g\n", fmod(x, 100)); // prints 0 x = 1e60; // x = 999999999999999949387135297074018866963645011013410073083904 printf("%.50g\n", fmod(x, 100)); // prints 4 x = DBL_MAX; // x = 179769313486231570...6184124858368 printf("%.50g\n", fmod(x, 100)); // prints 68 x = 123400000000.0 / 9999; // x = 12341234.1234123408794403076171875 printf("%.50g %a\n", fmod(x, 100), fmod(x, 100)); // prints 34.1234123408794403076171875 0x1.10fcbf9cp+5
笔记:
我的double
符合IEEE 754 binary64标准。
printf()
的局限性在这里没有问题,只是fmod()
。
[编辑]
注意:通过“预期确切的答案”,我问的是fmod()
结果和数学结果是否完全相同。
IEEE标准754将余数运算x REM y
定义为数学运算x - (round(x/y)*y)
。 即使在中间运算x/y
, round(x/y)
等具有不精确的表示时,结果也是精确的定义。
正如aka.nice所指出的,上面的定义与libm
中的库函数remainder
相匹配。 fmod
以不同的方式定义,要求结果与x
具有相同的符号。 但是,由于fmod
和remainder
之间的差异是0
或y
,我相信这仍然可以解释为什么结果是准确的。
fmod
的结果总是精确的; y
是否是整数是无关紧要的。 当然,如果x
和/或y
已经是某些实数a
和b
近似值,则fmod(x,y)
不太可能完全等于a mod b
。