我挖了旧代码,看到了这样的函数:
inline double mod(double x, double y)
{
return x-y*floor(x/y);
}
Run Code Online (Sandbox Code Playgroud)
是fmod其全部等同,或者已经我错过了什么?
不,上面的例行程序不一样fmod().具体而言,对于一个参数为负的情况,它是不同的.
你的例程执行a floor(),向下舍入到下一个整数.与fmod()舍入像trunc(),即接近零.
以下是Open Group标准的摘录(此处):
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.