理解 std::fmod 和 std::remainder

joh*_*co3 7 c++ math stl

有人可以解释一下函数std::fmodstd::remainder是如何工作的吗?在这种情况下std::fmod,有人可以解释一下步骤来说明如何:

std::fmod(+5.1, +3.0) = 2.1
Run Code Online (Sandbox Code Playgroud)

同样的事情std::remainder也会产生负面结果。

std::remainder(+5.1, +3.0) = -0.9
std::remainder(-5.1, +3.0) = 0.9
Run Code Online (Sandbox Code Playgroud)

P.W*_*P.W 4

正如std::fmod的参考所述:

\n\n

该函数计算出的除法运算的浮点余数x/y正是值x - n*y,其中nx/y小数部分被截断。

\n\n

返回值的符号相同, 且大小x小于。y

\n\n

因此,以问题中的例子为例,当x = +5.1和 时y = +3.0,\nx/y (5.1/3.0 = 1.7)的小数部分被截断为 1。n也是1。所以fmod意志产量x - 1*y是哪个5.1 - 1 * 3.05.1 - 3.0哪个是2.1

\n\n

std::remainder的参考状态为:
\n此函数计算的除法运算的 IEEE 浮点余数x/y恰好是值x - n*y,其中值 n 是最接近精确值 的整数值x/y。当 时|n-x/y| = \xc2\xbd,该值n被选择为偶数。

\n\n

因此,以问题中的例子为例,当x = +5.1y = +3.0\n最接近的整数x/y (1.7)值为2。亦是如此。n2因此,remainder将产生x - 2y5.1 - 2 * 3.0 ,5.1 - 6.0-0.9

\n\n

但当x = -5.1y = +3.0\n最接近的整数x/y (-1.7)值为-2。亦是如此。n-2所以remainder意志产量x - 2y是 哪-5.1 - (-2) * 3.0-5.1 + 6.0哪是+0.9

\n\n

该参考文献还指出: 与 相比std::fmod(),返回值不保证与具有相同的符号x

\n