gpt4 book ai didi

c++ - 为什么浮点值是这个?

转载 作者:行者123 更新时间:2023-11-30 02:50:35 24 4
gpt4 key购买 nike

当我阅读 C++ Primier Plus 中有关 float 的章节时。

它给出了一个例子,如下所示:

#include <iostream>

int main(){
using namespace std;

float a = 2.34E+22f;
float b = a + 1.0f;

cout << "a =" << a <<endl;
cout << "b -a =" << b - a<< endl;
return 0;
}

结果是:

a = 2.34e+22
b -a = 0

书中的解释是,我引用:

"The problem is that 2.34E+22 represents a number with 23 digits to the left of the decimal. By adding 1, you are attempting to add 1 to the 23rd digit in that number. But type float can represent only the first 6 or 7 digits in a number, so trying to change the 23rd digit has no effect on the value."

但是我不明白。谁能帮助我以一种可以理解的方式理解为什么 b -a 为 0?

最佳答案

float C/C++ 中的类型以标准的“单精度”格式存储。数字的形式是

±m*2^e

哪里m是 223 和 224 之间的整数,e是一个整数。 (我省略了很多与此处无关的细节。)

那么这如何解释您所看到的?

首先,代码中的数字总是“四舍五入”到最接近的 float 。所以值 2.34e+22实际上四舍五入为10391687*251,即23399998850475413733376。这就是a的值.

其次,浮点运算的结果总是四舍五入到最接近的 float 。所以,如果将 1 添加到 a ,结果是 23399998850475413733377,它再次四舍五入到最接近的 float ,当然,它仍然是 23399998850475413733376。所以 b获得与 a 相同的值.由于两个数字相等,a - b == 0 .

您可以将比 1 大得多的数字添加到 a仍然得到相同的结果。原因又是结果被四舍五入,最接近的 float 仍然是a。当您添加至少 250 或大约 1e+15 的数字时。

关于c++ - 为什么浮点值是这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com