当y是整数时,fmod()是否准确?

时间:2014-01-04 23:54:39

标签: c floating-point

在使用double fmod(double x, double y)y是一个整数时,结果似乎始终精确。

(这是y一个完整的确切数字,而不是这里的int。)

也许C不要求 fmod()在这些选择的情况下提供确切的答案,但是在我尝试的编译器上,结果是准确的,即使是{{的商1}}不完全可以表示。

  1. x/y是整数时,是否需要确切的答案?
  2. 如果没有,请提供一个反例。
  3. 示例:

    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 符合IEEE 754 binary64标准 double的限制在这里不是问题,只是printf()


    [编辑]

    注意:通过“预期确切答案”,我问的是fmod()结果和数学结果是否完全相同。

2 个答案:

答案 0 :(得分:10)

fmod的结果总是完全正确; y是否为整数是无关紧要的。当然,如果x和/或y已经是某些实数ab的近似值,则fmod(x,y)不太可能完全等于{ {1}}。

答案 1 :(得分:8)

IEEE标准754将余数运算x REM y定义为数学运算x - (round(x/y)*y)。即使中间操作x/yround(x/y)等具有不精确的表示,结果仍然是定义的。

正如aka.nice所指出的,上面的定义与remainder中的库函数libm相匹配。 fmod以不同的方式定义,要求结果与x具有相同的符号。但是,由于fmodremainder之间的差异是0y,我相信这仍然可以解释为什么结果是准确的。