理解 std::fmod 和 std::remainder
Posted
技术标签:
【中文标题】理解 std::fmod 和 std::remainder【英文标题】:understanding std::fmod and std::remainder 【发布时间】:2019-02-01 05:12:36 【问题描述】:有人能解释一下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
【问题讨论】:
来自您的链接:“由fmod(x, y)
计算的除法运算x/y
的浮点余数正是x - n*y
的值,其中n
是x/y
及其小数部分被截断。返回的值与x
具有相同的符号,并且在幅度上小于y
。"您觉得其中哪一部分不清楚?
在注意到您的个人资料表明您是航空航天业的开发人员之后,请原谅我对您要求围绕一个简单的数学概念重新解释详细文档的请求感到困惑。 =P
原谅 :),我通常使用整数对应 mod 和 div - 非常简单 - 浮动对应需要更多思考,这些示例没有在详细文档中完成,这是缺少的和P.W. 很好地解释了
【参考方案1】:
作为 std::fmod 的参考状态:
该函数计算的除法运算x/y
的浮点余数正是x - n*y
的值,其中n
是x/y
,其小数部分被截断。
返回值与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
具有相同的符号。
【讨论】:
【参考方案2】:对于那些可能难以理解 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.5
更接近于10
而不是7
。
10
距离10.5
有多远?
它与10.5
相距-0.5
。
【讨论】:
以上是关于理解 std::fmod 和 std::remainder的主要内容,如果未能解决你的问题,请参考以下文章