将单精度从二进制转换为十进制的公式

Formula to convert single precision from binary to decimal

提问人:user22609393 提问时间:9/22/2023 更新时间:9/24/2023 访问量:51

问:

我需要证明,包含 24 位总精度的单个精度格式相当于大约 7 个十进制数字的精度。

我发现的表达式只是对数10(224) = 7.225,它产生了 7 位精度的预期结果,但是,我找不到这个表达式的公式证明或关于它如何工作的直觉

浮点 二进制 decimalformat

评论


答:

1赞 chux - Reinstate Monica 9/22/2023 #1

关于它如何工作的直觉

对于普通浮点:

在 [1.0... 2.0) 之间有 223 个不同的 - 均匀分布。
在 [2.0... 4.0) 之间有 223 个不同的 - 均匀分布。
在 [4.0... 8.0) 之间有 223 个不同的 - 均匀分布。
floatfloatfloat

在 [8.0...10.0] 之间有 1/4 * 223 个不同的 - 均匀分布。float

在 [4.0...8.0) 之间,有 1/2 223 个不同的间距与 [8.0...10.0] 中的间距一样远。
在 [2.0...4.0) 之间,有 1/4 223 个不同的间距与 [8.0...10.0] 中的间距一样远。
在 [1.0...2.0) 之间,有 1/8 223 个不同的间距与 [8.0...10.0] 中的间距一样远。
floatfloatfloat

在 [1.0...10.0] 之间,有 9/8 223 个不同的间距,与 [8.0...10.0) 或 9,437,184 中的间距一样远。float

在 [1.0...10.0) 之间,有 9,000,000 个不同的 7 位十进制数字值,空间相距 0.000 001。

由于我们有 9,437,184 个均匀分布来编码超过 9,000,000 个不同的值,因此我们可以声称“大约 7 位十进制数字的精度”。float

不同的十进制范围将导致相似的“大约 7 位十进制数字”。

IIRC,最坏情况的十年仅略低于“精度的 7 位十进制数字”(约 6.92),可能在 [1,000,000...10,000,000] 范围内。


OP 的 log10(2,24) = 7.225 是一个很好的第一步。然而,值是按 2 的幂线性分布的。为了与十进制精度进行比较,我们希望看到 10 的各种幂之间的分布。float

C 规范的二进制值为 *1,如下所示,这接近 OP 的目标。FLT_DIGfloat

p = 24; // 24 digits
b = 2   // base 2
q = floor((p − 1) * log10(b))
q = floor(6.923...)
q = 6

*1
十进制位数 Q,这样任何具有 q 十进制数字的浮点数都可以四舍五入为具有 p 基数 b 数字的浮点数,然后再次返回,而不会更改为 q 十进制数字
FLT_DIG

1赞 vinc17 9/24/2023 #2

没有等价物。这取决于你真正想要什么。问题通常如下:您在基数 b 中有一个 p 位数字,并且您希望将其转换为基数 B 中的 P 位数字(到最接近的值),这样,如果您读回该值(即进行反转转换),您将获得初始值。大卫·马图拉(David Matula)在1968年解决了这个问题:In-and-Out Conconversions(免费提供)。如果一个基数不是另一个基数的幂,则公式为 P = 1 + ⌈p·log(b)/log(B)⌉(请注意,P 可能更大,但此公式给出的最小值始终有效)。

对于 2 和 10,可以应用此公式。因此,如果您希望能够将单精度值(b = 2,p = 24)转换为十进制,以便通过逆转换为单精度来返回此值,则需要 1 + ⌈24·log(2)/log(10)⌉ = 9 位。相反,一个 6 位十进制数可以转换为单精度并返回,因为 1 + ⌈6·log(10)/log(2)⌉ = 21 ⩽ 24,但你不会总是得到 7 位十进制数的初始值,因为 1 + ⌈7·log(10)/log(2)⌉ = 25 > 24。