余数函数remainder(x,y)是否真的等于x-((round(x/y)*y)?

3

阅读@anton此链接中的答案后,我尝试验证是否真的remainder(x, y)恰好等于x-(round(x/y)*y)

对于x=5.y=2.的值运行代码,得到结果:

printf("the value of remainder is %f\n",remainder(x, y));
printf("the value of remainder is %f\n",x-(round(x/y)*y));

余数的值为1.000000。

余数的值为-1.000000。

来自维基百科

浮点数余数。这不像正常的取模运算,对于两个正数它可能是负数。它返回x - (round(x/y)·y)的确切值。

安东的解释是错误的,还是我漏掉了什么?


2
该公式假设x和y为浮点数,而不是整数。 - Raymond Chen
1
IEEE使用银行家舍入法。他们认为round(2.5)应该是2而不是3。 - Hans Passant
@HansPassant,nearbyint() 函数是否使用银行家舍入法? - rondino
1
它使用由std::fesetround()设置的舍入模式。C++标准化委员会中没有银行家。 - Hans Passant
抱歉,round()在维基百科的上下文中是什么意思?您能否编辑您的问题并添加round()函数的定义? - Luis Colorado
显示剩余2条评论
1个回答

2

remainder函数有一点不同。根据man page的说明:

remainder()函数计算x除以y的余数。 返回值为x-n*y,其中n是将x / y四舍五入到最近整数的值。如果x-n*y的绝对值为0.5,则选择n为偶数。

所以在中间情况下,由remainder执行的四舍五入部分不会朝着零方向舍入,而是舍入到最接近的偶数


那我应该使用 nearbyint() 函数吗? - rondino
1
好答案(+1)。可能需要添加银行家舍入的链接/参考,以便OP了解更多关于不同舍入算法及其误差界限的信息。 :) - Cloud
如果您提供链接,我会检查您的答案! - rondino
@rondino 已添加链接。此外,我更改了引用的文本,因为它与我的本地手册不同(尽管含义相同)。 - dbush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接