在单点精度中,有 23 位的有效数,给出最大 2^24 的整数范围(如果我们只存储离散整数值)。指数为 8 位,范围最大为 2^127。对于大数量级的数字,有一个点,它们开始丢失有效数字/尾数。
这意味着像 (2^32 + 2^8) 这样的数字:
4,294,967,552
0x100000100
0b100000000000000000000000100000000
将简单地存储为:
指数 0b00100000
有效数/尾数 0b00000000000000000000000(1 个实现位)
并失去 256 的精度。
这似乎与所谓的“次正常”数字相反。本质上,作为整数存储在有效数中的数字范围比考虑指数时能够存储的数字范围小得多。所以一旦你达到 2^24 你就开始丢失信息(可能我对标准有误解)!这似乎与当存在有效数但指数小于 2^-127 时信息丢失时在次正常范围内发生的情况相反
我对 IEEE754 标准的理解是否遗漏了什么?
如果不是,当大量数字失去精度时,这种情况被称为什么(这似乎与次正常相反,也许是“超正常”)?
为了保持精度,我应该将所有 float 限制为 -(10^7) < x < 10^7 吗?
编辑 更新了 100,000,010 的数字,我还添加了更多语言来解释我的理解。
编辑2
@Weather Vane 是正确的。浮点精度的要点是,一旦我们开始增加幅度,它就会在小数范围内失去精度,当幅度增加超过有效数末尾的小数点时,这就会开始影响整数范围
0.0000000000000000000001
->->
10000000000000000000000.0
我可以理解为什么指数比有效数字大得多,以尽可能最大的精度表示超小数字,但对于大数量级的数字,一旦我们走,似乎有一整类数字会以大于小数的比例丢失信息binay 中超过 23 个数字。我想知道它们叫什么,如果它们有名字的话,例如“ super 正常”?
最佳答案
当实数的所有数字不能用浮点格式表示时所发生的情况称为“舍入”。
表示整数的情况有些特殊,因为在典型的浮点格式中,所有小整数都可以准确表示,特别是没有任何整数会因为太接近零而无法准确表示。
但是,由于该问题提到了次正规数,因此认为进入次正规领域的对偶数溢出是更普遍正确的。看待这个问题的一种方法是,在单精度 IEEE 754 数字的整个正常范围内,有效精度为 24 位,并且当数字太接近零(次正常范围)并且精度降低到 0 时,精度逐渐减小溢出时(+inf 和 -inf)一次全部位。
由于问题是关于表示整数(请参阅注释),因此在单精度 IEEE 754 中,任何整数 x 满足 -224 <= x <= 224可以安全地表示(即 [-16777216 … 16777216])。 16777217 是无法用单精度精确表示的最小正整数(最接近偶数规则意味着它会向下舍入到 16777216.0)。
浮点解决了表示一些非整数的实数以及一些大于所有整数可表示的最大整数(此处为 16777216)的更普遍的问题,所有这些都具有几乎统一的相对精度(至少 1/2精度)。
关于c - 当 float 大于其精度时,它被称为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812231/