如何解决如何确定浮点尾数的最大正基 10 值?
在尝试理解 int
时,如果给定 int 的大小(以位为单位),我可以使用排列公式来确定 int 的最大正负基数。因此,如果一个有符号整数是 16 位宽,我可以使用 2^16 来确定可能的排列数,然后可以使用 2^15 计算出正数的最大数量和负数的最大数量。
在 32 位浮点数中,为有效数及其符号分配了 24 位。如果我们认为符号为正,则 2^23 将是最大排列数。如何从这个数字 2^23 中获得有效数的最大值?还是我对浮点数的理解有问题?
解决方法
ieee-754 使用 significand 而不是 尾数。
C 没有定义尾数。 C 使用有效数。
Common float
normal1 值具有 24 位有效数,由 1 个值为 1 的隐含位和 23 个显式编码的二进制小数位组成。所有 224 组合都是可能的。
最大有效数为 1.11111111 11111111 11111112 或 1.9999998807907104492187510 或 (2.0-2-3) .
当它与有限数 2(254-127) 的最大二进制指数相结合时,最大值 float
,FLT_MAX
为 340282346638528859811704183484516925440.0 或约 236e+3440.0。 .
1对于子数,没有隐含位。
那个最大有效数是 0.11111111 11111111 11111112 或 0.9999998807907104492187510
,float
的正常有效数的可能值的数量为 (FLT_RADIX-1)/FLT_EPSILON
,其中 FLT_RADIX
和 FLT_EPSILON
定义为包含 <float.h>
。>
这是因为 FLT_EPSILON
是从 1 到下一个更大的可表示数的步长,所以它是有效位位的 1 变化(当它们被解释为二进制整数时,我们从浮点数 1.000…000)。 FLT_RADIX/FLT_EPSILON
计算有效数可以经过多少步,从 0 开始,直到它包装或溢出其前导数字。然而,我们不是从零开始;问题要求排除隐式前导 1 位。标准化的基于二进制的浮点数的前导位是 1,但是,当我们推广到其他基数时,浮点数的前导位对于标准化数可能不是 1;它可以是小于 FLT_RADIX
的非零整数。因此,从 1 而不是 0 开始,有 (FLT_RADIX-1)/FLT_EPSILON
可能的正常有效数值。
请注意,(FLT_RADIX-1)/FLT_EPSILON
具有整数值但为浮点类型。要将其用作整数类型,您可能需要进行强制转换,例如使用 %d
打印时。
与 1 具有相同标度(指数)但最大有效数为 FLT_RADIX - FLT_EPSILON
的浮点数。作为整数的有效数的最大值是FLT_RADIX/FLT_EPSILON - 1
。请注意,后者包括前导数字。
注意事项
“有效数”是浮点数小数部分的首选术语。 “尾数”是对数的小数部分的旧术语。有效数是线性的;将有效数乘以所表示的数字。尾数是对数;添加到尾数将乘以表示的数字。
“排列”是指移动事物; (1 2 3 4) 和 (3 4 2 1) 是彼此的排列。您似乎想要有效数位可以具有的不同值的数量。
,如果不考虑指数,尾数的大小就没有意义。 23 告诉你的是有效小数位数是 23 * log(2)
≈ 7。
然而,第 24 位是隐含的,给出的 24 * log(2)
大于 7。因此可以存储所有 7 位整数值而不会损失精度。
此外,任何以 2 的幂作为因数的整数,当除以该因数等于或小于 7 位时,也可以精确表示,因为 2 的幂被指数占用(取决于指数值的限制)。
因此,指数大小给出了可以存储的值的范围,而尾数(有效数)大小给出了精度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。