C ++变量类型 - 值

时间:2015-12-02 18:06:44

标签: c++ variables types

我是初学者,但我认为同样重要的是认为我应该尽快学习。 所以我有一个代码:

float fl=8.28888888888888888888883E-5;
cout<<"The value = "<<fl<<endl;

但运行后我的.exe文件显示:

8.2888887845911086e-005

我怀疑数字限制类型和休息将是零,但我看到数字,这是随机的。也许它在变量之后从内存中提供数字? 你能解释一下它是如何起作用的吗?

4 个答案:

答案 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。正如您所看到的,转换只是截断了最后的数字(在这种情况下。转换是根据舍入模式完成的,当舍入上升而不是下降时,它会更改一个或多个最后的数字)。

当您观察十进制中发生的情况时,您的计算机上floatdouble 二进制浮点格式的事实意味着值的表示中有额外的数字。

答案 1 :(得分:2)

  

我怀疑数字限制类型和休息将是零

这就是内部发生的事情。超出类型可存储的多余位将丢失。

但这是二进制表示。将它转换为十进制时,可以得到尾随的非零数字。

示例:

0b0.00100小数为0.125

答案 2 :(得分:1)

您所看到的是您无法在内存中准确表示浮点数的结果。因此,浮点数将被存储为可以存储在内存中的最近值。浮点数通常有24位用于表示尾数,转换为大约6位小数(这是实现定义的,因此您不应该依赖于此)。当打印超过6位十进制数字时,您会注意到您的值未按预期值存储在内存中,您将看到随机数字。

所以回顾一下,你遇到的问题是由于基数为10的十进制数不能在内存中表示,而是存储了最接近它的数字,然后会使用这个数字。

答案 3 :(得分:0)

每个数据类型的范围都在此范围之后,所有数字都来自内存或垃圾,因此您必须知道此范围并在编写代码时处理它。 您可以从herehere

了解此范围