gpt4 book ai didi

c++ - Density of floating point number - 数字的大小

转载 作者:太空狗 更新时间:2023-10-29 19:49:43 25 4
gpt4 key购买 nike

float 越大(无论是正数还是负数),我们用于编码十进制数字的位数就越少,这是真的吗?

我们能否在 21 和 22 之间编码比 216 和 232 之间更多的十进制数字?

这两个范围之间的值计数是否相同?

最佳答案

IEEE 754,binary-32 数规定如下:

IEEE 754, binary-32 number format

基本上它包含三个部分:

  • 1位float32_sign表示符号
  • 23 位 float32_fraction[] 表示二进制小数系数
  • 8 位 float32_exp 表示 2 的整数指数

参见 wikipedia/Single-precision_floating-point_format了解详情。

获取实际数字的公式为:

IEEE 754, binary-32 number formula

忘记指数,小数部分可以准确表示 pow(2, 23) = 8388608 值。此范围内的最大值和最小值是:

    ( 1 + 0, 1 + sum(pow(2, -i)) )  # All co-efficients being 0 and 1 resp. in the above formula
=> ( 1, 2 - pow(2, -23) ) # By geometric progression
~> ( 1, 2 ) # Approximation by upper-bound

因此对于指数为 1 (float32_exp = 128),我们将在 (1,2)(-1,-2) 之间有 8388608 个数字

但是对于大数,例如当指数为 126 (float32_exp = 253) 时,我们仍然只有 8388608 个数字来表示 (2^126), 2^127) 之间的差距(-2^126, -2^127)

1 到 128 之间的分布图如下所示:

enter image description here

该图在 0 处非常陡峭,绘制它会使它看起来像仅在 0 处的单个值。请注意,该图是一条双曲线。

获取两个值之间的 float 个数的公式为:

def num_floats(begin, end):
# pow(2, 23) * (log(end, 2) - log(start, 2)) == pow(2, 23) * log(end/start, 2)
return 8388608 * math.log(float(end)/float(begin), 2)

关于c++ - Density of floating point number - 数字的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006510/

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