【发布时间】:2012-02-26 16:03:57
【问题描述】:
我有一个 C++ 程序(使用 g++ 编译)。我正在尝试将两个双精度数作为操作数应用于模函数,但出现以下错误:
错误:“double”和“double”类型的无效操作数到二进制“operator%”
代码如下:
int main() {
double x = 6.3;
double y = 2;
double z = x % y;
}
【问题讨论】:
-
如前所述,fmod() 提供了必要的功能。正如尚未注意到的那样,重要的是要意识到
fmod的第二个操作数中的舍入错误可能会导致意外行为。例如,fmod(1, 0.1);在数学上应该为零,但实际上几乎是 0.1。误差的程度随着商的大小而增加。例如,fmod(9E14, 0.1);的计算结果约为 0.05,从数学角度来看这是完全错误的。 -
@supercat 更多细节会很棒。我认为对幕后发生的事情使您所说的话有所了解,但是最好了解您所说的话是真实的原因;看看它在幕后是如何工作的会很有趣(我想我理解但很容易出错)。
-
浮点值表示精确的整数倍数或 2 的幂的分数。例如,整数文字 0.1 正好是 3602879701896397/36028797018963968(后一个值是 2 的幂)。
fmod(x,0.1)将 x 除以该精确分数并取余数,而不是除以数值“十分之一”。