当操作数小于129时,C++ float不会更改

hus*_*sik -6 c++ floating-point

在这里,我从浮点变量中减去128.0和129.0倍.

#include "stdafx.h"
#include<stdlib.h> //is this the problem? Or am i doing something wrong?
int main()
{

float d1=3.0e9;
printf("\n before: %f \n",d1);
for(int i=0;i<2000000;i++) d1=d1-128.0; //doesnt change!    
printf("\n after : %f \n",d1);
for(int i=0;i<2000000;i++) d1=d1-129.0; //does change!
printf("\n after2: %f \n",d1);

//is 129 is the minimum step for sub/add ? Isnt this wrong? 
//Is this about exponential part 10^9 ?
getchar();
return 0;
 }
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

问题:为什么这个浮点数不会因为小于129的操作数添加/ subbing而改变?因为我选择初始浮动值3.0e9?

当我选择初始值3.0e10时,初始化和两次减法都不起作用.

当我选择初始值3.0e8时,最小变化为17.所以16不会改变.:(

所以,谢谢你的回答.当初始值变小时,最小步长会根据精度变小.

VC++ 2010表达.windows xp 32位.奔腾-M

Dan*_*ani 5

这是因为你的初始价值.浮点数只能容纳少量数字,因此它不能代表操作的结果,而是将其四舍五入到最接近的值.


Ben*_*Ben 5

double而不是float.

然后了解"精确"的概念.

类型float适用于大约9位小数.这里有32位浮点的完整描述:


Ker*_* SB 5

我们可以通过查看32位浮点的解剖结构来了解正在发生的事情.该值3.0E9在IEEE754格式0x4F32D05E,以指数值31(你可以使用这个在线计算器找到该值).

现在我们有23个子统一二进制数字留给尾数.这意味着最小的增量,即与尾数的相邻值之间的差异,是二进制刻度31 - 23 = 8的数字.由于128是2 7,我们看到它只是小到足以从结束时掉下来尾数,而129足够大,可见.