从32位二进制数IEEE-754单精度表示计算实数X.

时间:2014-02-04 18:14:29

标签: ieee-754

我不确定我所做的是否是解决问题的最佳方式:

<0010> 0010 0010 0001 1110 1100 1110 0000 0000

我把它分开了:

签名: 0(正面)

指数:0100 0100(在基数2中) - &gt; 2 ^ 2 + 2 ^ 6 = 68 - &gt;超过127:68 - 127 = -59(基数10)

Mantissa:(1).001 1110 1100 1110 0000 0000 - &gt;需要十进制数:d-10 = d-2 * log2 / log10 = 24 * log2 / log10 = 7.22~8(老师告诉我们要总结一下)

所以基数10中的尾数是:2 ^ 0 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -8 + 2 ^ -9 + 2 ^ -12 + 2 ^ -13 + 2 ^ -14 = 1.2406616(基数10)

因此实数是:

+1.2406616 * 2 ^( - 59) = 2.1522048 * 10 ^ -18

但是10 ^ x表示好吗?如何找到合适数量的sig figs?它会与上面使用的规则相同吗?

1 个答案:

答案 0 :(得分:0)

表示几乎是好的。我要说你需要总共9个(你有8个)有效数字。

请参阅Printf width specifier to maintain precision of floating-point value

有效数字的位数取决于 right 的含义。

如果您要打印到x有效小数位,并将其读回并确保您再次使用相同的数字x,那么对于所有 IEEE- 754单,需要总共9个小数位.1之前和之后''。用科学记数法。对于某些数字,您可能会得到较少的数字,但有些数字需要多达9个。

在C中,这被定义为FLT_DECIMAL_DIG

打印超过9并没有伤害,它只是没有转换为不同的IEEE-754单精度数字只使用了9。

OTOH如果您使用带有y有效数字的文本十进制数字开头,将其转换为IEEE-754单个然后再转换为文本,那么您应该指望的最多y个数字始终有效6。

在C中,这被定义为FLT_DIG


所以最后,我会说d-10 = d-2 * log2 / log10 几乎正确。但由于2(IEEE-754单一)和10(x.xxxxxxxx * 10 ^ expo)的幂不匹配(期望为1.0),使用文本的精度为FLT_DECIMAL_DIG

“十进制数字 n ,这样任何带有 p radix b 数字的浮点数都可以舍入为浮点数带有 n 十进制数字的点数,然后再返回而不更改值,

p log10 b              if b is a power of 10
ceiling(1 + p log10 b) otherwise"
在IEEE-754单

的情况下

9