C++双运算符+

rub*_*nvb 4 c++ math floating-point double

可能重复:
浮点数学不正确?
Float编译时计算没有发生?

奇怪的事情发生在今天,我即将失去它...

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
    cout << setprecision(14);
    cout << (1/9+1/9+4/9) << endl;
}
Run Code Online (Sandbox Code Playgroud)

此代码在MSVC 9.0 x64和x86以及GCC 4.4 x64和x86(默认选项和严格数学...)上输出0.据我记得,1/9+1/9+4/9 = 6/9 = 2/3 != 0

AnT*_*AnT 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.

PS最后有机会回答这个问题:)

  • @RenéWolferink:"L"的大写是无关紧要的.当附加到整数文字时,"l"和"L"都会使它变长,当附加到浮动文字时会使它成为一个长双(实际上,你链接的那个页面甚至说得那么多).@AndreyT:是不是必须要有"1.0f"而不是"1f"?如果没有小数点或指数,我认为浮动后缀无效. (4认同)
  • 如果你命名为double并浮动,你可以将其命名为long double:1L (2认同)

Bri*_*ndy 7

在计算中使用小数点可以强制浮点数学以及其中一个后缀:f l F L在数字上.单独没有小数点且没有这些后缀之一的数字不被视为浮点字面值.

关于浮动文字的C++ 03 2.13.3-1:

浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成.整数和分数部分都由一系列十进制(十进制)数字组成.可以省略整数部分或小数部分(不是两者); 可以省略小数点或字母e(或E)和指数(不是两者).整数部分,可选的小数点和可选的小数部分构成浮动文字的重要部分.指数(如果存在)表示要对其进行缩放的10的幂.如果缩放值在其类型的可表示值范围内,则结果为缩放值(如果可表示),否则,最接近缩放值的较大或较小的可表示值,以实现定义的方式选择.除非后缀明确指定,否则浮动文字的类型为double.后缀f和F指定float,后缀l和L指定long double.如果缩放值不在其类型的可表示值范围内,则程序格式不正确.18

  • 或者使用boost :: rational,如果你只是要扔掉很多分数. (2认同)

Ren*_*ink 6

它们都是整数.所以1/9是0. 4/9也是0.而0 + 0 + 0 = 0.所以结果是0.如果你想要分数,将你的分数投射到浮点数.