fmod与否fmod?

use*_*932 7 c c++ math

我挖了旧代码,看到了这样的函数:

inline double mod(double x, double y)
{
    return x-y*floor(x/y);
}
Run Code Online (Sandbox Code Playgroud)

fmod其全部等同,或者已经我错过了什么?

abl*_*igh 9

不,上面的例行程序不一样fmod().具体而言,对于一个参数为负的情况,它是不同的.

你的例程执行a floor(),向下舍入到下一个整数.与fmod()舍入像trunc(),即接近零.

以下是Open Group标准的摘录(此处):

x- i* y对于某些整数,这些函数应返回该值,i如果y非零,则结果具有x与幅度相同的符号和幅度y.

如果正确的值会导致下溢并且无法表示,则可能会发生范围错误,并且应返回0.0(如果支持)或实现定义的值.

如果x或者yNaN,一个NaN应返还

如果y为零,则应发生域错误,并且NaN应返回(如果支持)或实现定义的值.

如果x是无限的,则应发生域错误,并且NaN应返回(如果支持)或实现定义的值.

如果x±0y否,±0则返回.

如果x不是无限且y是±Inf,x则应返回.

如果正确的值会导致下溢并且可表示,则可能发生范围错误并返回正确的值.

这很难理解,但第一段中的" 幅度 " 一词表明四舍五入为零.

以下是GCC库更有用的文档摘录:

这些函数通过分母从分子的除法计算余数.具体来说,返回值是numerator- n*denominator,其中nnumerator除以的商denominator,向零舍入为整数.因此,fmod(6.5,2.3)返回1.9,即6.5减去4.6.