我是初学者,但我认为同样重要的是认为我应该尽快学习。 所以我有一个代码:
float fl=8.28888888888888888888883E-5;
cout<<"The value = "<<fl<<endl;
但运行后我的.exe文件显示:
8.2888887845911086e-005
我怀疑数字限制类型和休息将是零,但我看到数字,这是随机的。也许它在变量之后从内存中提供数字? 你能解释一下它是如何起作用的吗?
答案 0 :(得分:3)
我怀疑数字限制类型和休息将是零
是的,这正是发生的事情,但它发生在二进制中。该程序将使用十六进制打印格式%a
:
#include <stdio.h>
int main(int c, char *v[]) {
float fl = 8.28888888888888888888883E-5;
printf("%a\n%a\n", 8.28888888888888888888883E-5, fl);
}
它显示:
0x1.5ba94449649e2p-14 0x1.5ba944p-14
在这些结果中,0x1.5ba94449649e2p-14
是最接近8.28888888888888888888883 * 10 -5 的double
的十六进制表示,而0x1.5ba944p-14
是转换的表示到该号码的float
。正如您所看到的,转换只是截断了最后的数字(在这种情况下。转换是根据舍入模式完成的,当舍入上升而不是下降时,它会更改一个或多个最后的数字)。
当您观察十进制中发生的情况时,您的计算机上float
和double
二进制浮点格式的事实意味着值的表示中有额外的数字。
答案 1 :(得分:2)
我怀疑数字限制类型和休息将是零
这就是内部发生的事情。超出类型可存储的多余位将丢失。
但这是二进制表示。将它转换为十进制时,可以得到尾随的非零数字。
示例:
0b0.00100
小数为0.125
答案 2 :(得分:1)
您所看到的是您无法在内存中准确表示浮点数的结果。因此,浮点数将被存储为可以存储在内存中的最近值。浮点数通常有24位用于表示尾数,转换为大约6位小数(这是实现定义的,因此您不应该依赖于此)。当打印超过6位十进制数字时,您会注意到您的值未按预期值存储在内存中,您将看到随机数字。
所以回顾一下,你遇到的问题是由于基数为10的十进制数不能在内存中表示,而是存储了最接近它的数字,然后会使用这个数字。
答案 3 :(得分:0)