【发布时间】:2015-12-25 01:26:26
【问题描述】:
在单点精度中,有一个 23 位的有效位,给出一个整数范围(如果我们只存储一个离散的整数值)最多 2^24。指数为 8 位,范围最大为 2^127。在大数量级的数字中,它们开始从有效数/尾数中丢失有效数字。
这表示像 (2^32 + 2^8) 这样的数字:
4,294,967,552
0x100000100
0b1000000000000000000000000100000000
将简单存储为:
指数 0b00100000
有效数/尾数 0b00000000000000000000000(1 个实现位)
并从精度上损失 256。
这似乎与所谓的“亚正常”数字相反。本质上,在有效数字中存储为整数的数字范围远小于考虑指数时能够存储的数字范围。因此,一旦达到 2^24,您就会开始丢失信息(可能我对标准有误解)!这似乎与亚正常范围内发生的情况相反,即当存在有效数字但指数小于 2^-127 时信息丢失
我对 IEEE754 标准的理解是否遗漏了什么?
如果不是,那么当大量数字失去精度时(这似乎与次常态相反,也许是“超常态”),这种情况称为什么?
为了保持精度,我应该将所有浮点数限制为 -(10^7)
编辑 将数字从 100,000,010 更新,我还添加了更多语言来解释我的理解。
编辑 2
@Weather Vane 是正确的。浮点精度的关键在于,一旦我们开始增加幅度,它就会在小数范围内失去精度,当幅度增加小数点超过有效数末尾时,这就会开始影响整数刻度
0.0000000000000000000001
->->
10000000000000000000000.0
我可以看到为什么指数比有效数字大得多,以便以尽可能最大的精度表示超小数字,但是对于大数量级的数字,似乎有一整类数字一旦我们去,就会以大于分数的比例丢失信息超过 23 sig 无花果在 binay。我想知道它们叫什么,如果它们甚至有名字,例如“超正常”?
【问题讨论】:
-
请使用二进制或十六进制的值“100,000,010”,否则你会完全糊涂。二进制浮点表示不旨在保留十进制数字。将值转换为单精度时可能会丢失 10 个,或者可能不会丢失,或者可能会丢失超过 10 个。
-
我明白,但只有当我们超过大约 7 个有效数字精度时,信息才会丢失,对吧?
-
您在寻找“四舍五入”这个词吗?这是唯一想到的描述一种情况,在这种情况下,您尝试拟合无法以浮点格式精确表示的数字。舍入适用于所有值,无论大小,但对于整数,范围 -2^24
-
@lindsaymacvean 否,因为此格式可能无法准确表示数字。
-
好吧,这与数字无关,我只是想找出一个更好的示例十进制数,当转换为浮点数时会丢失信息。为了便于说明,我将发布为二进制数。
标签: c floating-point precision