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

标签 c floating-point

在使用 double fmod(double x, double y) 并且 y 是一个整数时,结果似乎总是准确。

(即y是一个整数,不是这里的int。)

也许 C 不要求 fmod() 在这些选择的情况下提供准确的答案,但在我试过的编译器上,结果是准确的,即使x/y 的商不能准确表示。

  1. y 是整数时,是否期望得到准确的答案?
  2. 如果不是,请提供反例。

例子:

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()


[编辑]

注意:通过“Are exact answers expected”,我问的是 fmod() 结果和数学结果是否完全相同。

最佳答案

fmod 的结果总是是准确的; y 是否为整数无关紧要。当然,如果 x 和/或 y 已经是一些实数 ab 的近似值,那么 fmod(x,y) 不太可能完全等于 a mod b

关于c - 当 y 是整数时,fmod() 是否准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928253/

相关文章:

java - 为什么 MySQL 的 float 与 Java 的 float 不同?

使用 GCC 生成连续的 Hex 文件

C - 将整数放入字符数组中并提取它

arrays - 函数中 int* a 和 int (*a)[N] 的区别?

c++ - 使用运行平均值保持浮点精度

c - *((int*)&f) 在 C 中做什么?

java - 声明一个变量但不初始化它会提高性能吗?

c - 为什么使用数组名称作为 int 文字的下标是有效的

python - (Python) 类型错误 : 'float' object is not subscriptable

c++ - 如何解释 32 位浮点 wav 数据