fmod与否fmod?

时间:2015-11-10 14:21:19

标签: c++ c math

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

inline double mod(double x, double y)
{
    return x-y*floor(x/y);
}

fmod完全相同,还是我错过了什么?

1 个答案:

答案 0 :(得分:9)

不,上述例程与fmod()不同。具体而言,对于一个参数为负的情况,它是不同的。

你的例程执行floor(),它向下舍入到下一个整数。使用fmod(),舍入类似于trunc(),即朝向零。

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

  

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

     

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

     

如果xyNaN,则应返回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。