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最后我有机会回答这个问题:)
在计算中使用小数点可以强制浮点数学以及其中一个后缀:f l F L在数字上.单独没有小数点且没有这些后缀之一的数字不被视为浮点字面值.
关于浮动文字的C++ 03 2.13.3-1:
浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成.整数和分数部分都由一系列十进制(十进制)数字组成.可以省略整数部分或小数部分(不是两者); 可以省略小数点或字母e(或E)和指数(不是两者).整数部分,可选的小数点和可选的小数部分构成浮动文字的重要部分.指数(如果存在)表示要对其进行缩放的10的幂.如果缩放值在其类型的可表示值范围内,则结果为缩放值(如果可表示),否则,最接近缩放值的较大或较小的可表示值,以实现定义的方式选择.除非后缀明确指定,否则浮动文字的类型为double.后缀f和F指定float,后缀l和L指定long double.如果缩放值不在其类型的可表示值范围内,则程序格式不正确.18
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |