1

根据 IEEE 754-2008,有 binary32 和 decimal32 标准:

                                                            Decimal Decimal
Name        Common name         Base  Digits E min  E max   Digits  E max
binary32    Single precision    2     23+1   −126   +127    7.22    38.23
decimal32                       10    7      −95    +96     7       96

所以两者都使用 32 位,但十进制 32 有 7 位,E max 为 96,而 float32 有 7.22 位,E max 约为 38。

这是否意味着十进制 32 具有相似的精度但范围更好?那么是什么阻止了在 float32 上使用 decimal32 呢?那是他们的表现(即速度)吗?

4

3 回答 3

2

当您说“十进制 32 具有相似的精度……”时,您的推理是有缺陷的:在 1 和 1e7 之间,二进制 32 可以表示比十进制32 多得多的数字。选择将精度表示为二进制格式的“等效”数字十进制数字会产生错误的印象,因为在这些十进制数字序列中,在某些领域,二进制格式可以表示具有额外精度的数字。

1 到 1e7 之间的 binary32 数字的数量可以通过减去它们的二进制表示来计算,就好像它们是整数一样。同一范围内的 decimal32 数字的数量是 7 个十进制 (*),或 7e7(1 和 9.999999 之间的 1e7 数字,10 和 99.99999 之间的另外 1e7 数字,...)。

(*) 就像一个binade,但为十次方。

于 2014-01-10T07:26:19.237 回答
1

如果您需要精确表示小数,请使用 decimal32。如果通常对任意实数的良好近似更重要,请使用 binary32。

于 2014-01-10T14:40:14.537 回答
0

Decimal32不具有与 类似的精度float。例如,让我们取 1 000 000 000(10 亿)。

使用Decimal32,它将在内部存储器中表示为 1 000 000×10 3,有效位数为 7 位。实际上,对于 10 亿(100 000×10 4,……它们都被称为这个数字的队列),还有许多其他可能的表示形式,但对于我们将尝试做的事情来说,它们的精确度会降低。

在 的情况下float,它表示为 15 625 000×2 6或更精确的二进制 1.11011100110101100101000×10 (10011100-1111111)

Decimal32因此,对于10 3 = 1000 但 2 6 = 64 时,到下一个精确数字的最小步长(即通过将 1 添加到有效数字的 LSB)float,因此float在这种情况下更精确 ×15.625!但是请注意,并非所有数字都如此。这个比率取决于两个指​​数,我在这里选择了一个有重要区别的具体案例。

这种降低的精度Decimal32是为其扩展范围付出的代价。

于 2018-06-19T15:49:00.593 回答