gpt4 book ai didi

c - 移位后 float 的位布局如何给我某些值?

转载 作者:行者123 更新时间:2023-12-05 09:05:30 25 4
gpt4 key购买 nike

出于好奇并想了解更多有关浮点的知识,我运行了以下 C 代码:

#include <stdio.h>

int main() {
float a = 1.0 + ((float) (1 << 22));
float b = 1.0 + ((float) (1 << 23));
float c = 1.0 + ((float) (1 << 24));

printf("a = %.6f\n", a);
printf("b = %.6f\n", b);
printf("c = %.6f", c);
}

结果是:

a = 4194305.000000
b = 8388609.000000
c = 16777216.000000

我对为什么会得到这些结果感到困惑。任何人都可以解释为什么 a、b 和 c 的位布局导致每个值是什么?我是位移位和 float 的新手,非常感谢清晰的解释。谢谢。

最佳答案

(1 << 22)

是一个等于

的整数值
2^22 = 4194304

然后通过 (float) (1 << 22) 将其转换为 float 这给你相同的值(value)

4194304.0

然后加上 1.0 得到结果 4194305.0

其他情况也一样。

所以这不是关于“ float 的布局”——而是关于整数的布局和从整数到 float 的转换。

然而,最后一个案例你使用了1 << 24有点意思(和float格式有关)。

(1 << 24) is 16777216

并且可以转换为相同的浮点值,即

16777216.0

但是当你这样做的时候

1.0 + 16777216.0

你还是得到了

16777216.0

原因是 float 的精度有限(即并非所有数字都可以以浮点格式呈现)。值 16777217.0 无法以浮点格式显示,因此将 1.0 添加到 16777216.0 仍然会得到 16777216.0

顺便说一句:有几种舍入模式(参见例如 https://en.wikipedia.org/wiki/Floating-point_arithmetic#Rounding_modes )所以当无法以浮点格式显示精确结果时,您需要知道您的系统舍入模式以确定将使用哪个值而不是确切的结果。

关于c - 移位后 float 的位布局如何给我某些值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67190303/

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