gpt4 book ai didi

c - c中 float 的精确表示

转载 作者:太空狗 更新时间:2023-10-29 17:27:24 29 4
gpt4 key购买 nike

void main()
{
float a = 0.7;

if (a < 0.7)
printf("c");
else
printf("c++");
}

在上面的问题中,对于 0.7,将打印“c”,但对于 0.8,将打印“c++”。为什么?

任何 float 如何以二进制形式表示?

在某些地方,提到内部 0.7 将存储为 0.699997,但 0.8 将存储为 0.8000011。为什么会这样?

最佳答案

基本上使用 float 你可以得到 32 位编码

VALUE   = SIGN * MANTISSA * 2 ^ (128 - EXPONENT)
32-bits = 1-bit 23-bits 8-bits

存储为

MSB                    LSB
[SIGN][EXPONENT][MANTISSA]

因为您只能获得 23 位,这就是您可以存储的“精度”量。如果您试图表示以 2 为基数的无理分数(或重复分数),则位序列将在第 23 位“四舍五入”。

0.7 base 10 是 7/10 二进制是 0b111/0b1010 你得到:

0.1011001100110011001100110011001100110011001100110011... etc

由于这种情况会重复出现,因此无法以固定精度精确表示它。这0.8 也是如此,二进制形式是:

0.1100110011001100110011001100110011001100110011001101... etc

要查看这些数字的固定精度值是多少,您必须按照您的位数“切断它们”并进行数学运算。唯一的技巧是你的前导 1 是隐含的而不是存储的,所以你在技术上可以获得额外的精度。由于舍入,最后一位将是 1 或 0,具体取决于截断位的值。

因此 0.7 的值实际上是 11,744,051/2^24(无舍入效果)= 0.699999988,而 0.8 的值实际上是 13,421,773/2^24(向上舍入)= 0.800000012。

这就是它的全部:)

关于c - c中 float 的精确表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306177/

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