了解 std::fmod 和 std::余数

understanding std::fmod and std::remainder

本文关键字:std 余数 fmod 了解      更新时间:2023-10-16

有人可以解释一下函数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

正如std::fmod的引用所述:

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

返回值与x具有相同的符号,并且量级小于y

所以以问题中的例子为例,当x = +5.1y = +3.0时, 截断小数部分的x/y(5.1/3.0 = 1.7)为 1。所以n1.因此,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.1y = +3.0最接近x/y (1.7)的整数值是2。所以n2.因此,remainder将产生x - 2y,即 5.1 - 2 * 3.0,这是5.1 - 6.0-0.9

但是当x = -5.1y = +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具有相同的符号

对于那些可能难以理解P.W.的好例子的人来说,这里有一个稍微不那么数学的方法。

fmod()函数告诉您将分子平均除以分母后还剩多少。

remainder()函数告诉您分子与分母均匀划分为下一个最接近的数字的距离。

例子:

fmod(10,3.5)=3.

3.5可以装进10两次(2*3.5 = 7),留下3的余数。

<小时 />

remainder(10,3.5)=-0.5.

3.5不能均匀地适应10,但它可以均匀地适应7(2*3.5)和10.5(3*3.5)。

10.57更接近10

1010.5有多远?

距离10.5-0.5