我挖掘旧代码,看到了这样的函数:
inline double mod(double x, double y)
{
return x-y*floor(x/y);
}
是fmod
完全相同,还是我错过了什么?
答案 0 :(得分:9)
不,上述例程与fmod()
不同。具体而言,对于一个参数为负的情况,它是不同的。
你的例程执行floor()
,它向下舍入到下一个整数。使用fmod()
,舍入类似于trunc()
,即朝向零。
以下是Open Group标准(here)的摘录:
对于某个整数
x- i* y
,这些函数应返回值i
,这样,如果y
非零,则结果与x
具有相同的符号,幅度小于y
的幅度。如果正确的值会导致下溢并且无法表示,则可能会出现范围错误,并且应返回0.0(如果支持)或实现定义的值。
如果
x
或y
为NaN
,则应返回NaN
如果
y
为零,则会发生域错误,并且应返回NaN
(如果支持)或实现定义的值。如果
x
是无限的,则会发生域错误,并且应返回NaN
(如果支持)或实现定义的值。如果
x
为±0
且y
不为零,则应返回±0
。如果
x
不是无限且y是±Inf
,则应返回x
。如果正确的值会导致下溢并且可以表示,则可能会发生范围错误并返回正确的值。
这很难理解,但第一段中的“幅度”一词表示四舍五入为零。
以下是GCC库更有用的文档摘录:
这些函数通过分母从分子的除法计算余数。具体来说,返回值为
numerator
-n
*denominator
,其中n
是numerator
除以denominator
的商,舍入为零到整数。因此,fmod
(6.5,2.3)返回1.9,即6.5减去4.6。