-6

在这里,我从浮点变量中减去 128.0 和 129.0 2M 次。

#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;
 }

输出:

在此处输入图像描述

问题:为什么这个浮点数不会通过添加/替换小于 129 的操作数来改变?因为我选择了初始浮点值 3.0e9 ?

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

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

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

VC++ 2010 速成 . windows xp 32位。奔腾-m

4

3 回答 3

5

这是因为你的初始值。浮点数只能包含少量数字,因此它不能表示运算结果,它会将其四舍五入到最接近的值。

于 2012-08-14T12:25:19.807 回答
5

使用double而不是float.

然后了解“精度”的概念。

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

于 2012-08-14T12:26:10.367 回答
5

我们可以通过查看32 位 float的解剖结构来了解发生了什么。3.0E9IEEE754 格式的值为0x4F32D05E,指数值为 31(您可以使用此在线计算器查找该值)。

现在我们为尾数留下了 23 个子单位二进制数字。这意味着最小的增量,即尾数的相邻值之间的差异,是一个二进制标度为 31 − 23 = 8 的数字。由于 128 是 2 7,我们看到它小到足以从尾数,而 129 大到可以看到。

于 2012-08-14T12:30:35.410 回答