可能重复:
Incorrect floating point math?
Float compile-time calculation not happening?
今天发生了奇怪的事情,我即将失去它......
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
cout << setprecision(14);
cout << (1/9+1/9+4/9) << endl;
}
此代码在MSVC 9.0 x64和x86以及GCC 4.4 x64和x86(默认选项和严格数学...)上输出0。据我所知,1/9+1/9+4/9 = 6/9 = 2/3 != 0
答案 0 :(得分:32)
1/9
零,因为1和9是整数,除以整数除法。这同样适用于4/9
。
如果要通过算术文字表达浮点除法,则必须使用浮点文字1.0/9 + 1.0/9 + 4.0/9
(或1/9. + 1/9. + 4/9.
或1.f/9 + 1.f/9 + 4.f/9
)或显式转换一个操作数所需的浮点类型(double) 1/9 + (double) 1/9 + (double) 4/9
。
P.S。最后我的机会回答这个问题:)
答案 1 :(得分:7)
在计算中使用小数点强制浮点数学可选以及其中一个后缀:f l F L
在您的数字上。单独一个没有小数点而没有其中一个后缀的数字不被视为浮点字面值。
C ++ 03 2.13.3-1关于浮动文字:
浮动文字由一个 整数部分,小数点,a 分数部分,e或E,a 可选的有符号整数指数 和可选的类型后缀。该 整数和分数部分 由十进制序列组成(基数 十)数字。整数部分 或者分数部分(不是两者)都可以 省略;小数点或 字母e(或E)和指数 (不是两者)可以省略。整数 部分,可选的小数点和 可选的分数部分形成 漂浮的重要部分 文字。指数,如果存在, 表示10的幂 重要的是要缩放。如果 缩放值在范围内 其类型的可表示值, 结果是缩放值if 可表示的,否则更大的或 最小的可表示值 缩放值,选择在 实现定义的方式。该 浮动文字的类型是双倍的 除非由a明确指定 后缀。后缀f和F指定 float,后缀l和L指定 长双。如果缩放值是 不在可表示的范围内 它的类型的值,程序是 病态的。 18
答案 2 :(得分:6)
它们都是整数。所以1/9是0. 4/9也是0.而0 + 0 + 0 = 0.所以结果是0.如果你想要分数,将你的分数投射到浮点数。
答案 3 :(得分:4)
1/9(=0)+1/9(=0)+4/9(=0) = 0
答案 4 :(得分:3)
好吧,在C ++(和许多其他语言)中,1/9+1/9+4/9
为零,因为它是整数运算。
你可能想写1/9.0+1/9.0+4/9.0
答案 5 :(得分:3)
除非您特别指定小数,否则C ++使用的数字是整数,因此1/9 = 4/9 = 0
和0 + 0 + 0 = 0
。
您只需添加小数1.0
等...
答案 6 :(得分:3)
根据类型的C规则,你在那里进行所有整数数学运算。 1/9和4/9都被截断为0(作为整数)。如果你写了1.0 / 9.0等,它将使用双精度数学并做你想要的。
答案 7 :(得分:-3)
你可能习惯使用更多的括号。他们花费的时间很少,明确你的意图,并确保你得到你想要的。好吧,主要是......;)