有人可以解释功能std::fmod和std::remainder的工作方式。对于std::fmod
,有人可以解释这些步骤以显示如何:
std::fmod(+5.1, +3.0) = 2.1
std::remainder
也会产生负面结果。
std::remainder(+5.1, +3.0) = -0.9
std::remainder(-5.1, +3.0) = 0.9
答案 0 :(得分:1)
作为 std::fmod 的参考状态:
此函数计算的除法运算x/y
的浮点余数正好是值x - n*y
,其中n
是x/y
,其小数部分被截断了。 / p>
返回值的符号与 {strong> x
相同,并且幅度小于y
。
以问题中的示例为例,当x = +5.1
和y = +3.0
时,
x/y
(5.1/3.0 = 1.7)
,其小数部分被截断为1。因此,n
是1
。因此fmod
将产生x - 1*y
,即5.1 - 1 * 3.0
,即5.1 - 3.0
,即2.1
。
std::remainder 的参考状态:
该函数计算的除法运算x/y
的IEEE浮点余数正好是值x - n*y
,其中值n是最接近精确值x/y
的整数值。当|n-x/y| = ½
时,值n
被选择为偶数。
以问题的例子为例,x = +5.1
和y = +3.0
与x/y (1.7)
最接近的整数值为2
。因此n
是2
。因此remainder
将产生x - 2y
,它是5.1-2 * 3.0,而5.1 - 6.0
是 -0.9
。
但是当x = -5.1
和y = +3.0
与x/y (-1.7)
最接近的整数值为-2
。因此n
是-2
。因此remainder
将产生x - 2y
,即-5.1 - (-2) * 3.0
,即-5.1 + 6.0
,即 +0.9
参考文献还指出:与std::fmod()
相比,不保证返回的值与x
具有相同的符号。