我不确定我所做的是否是解决问题的最佳方式:
<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?它会与上面使用的规则相同吗?
答案 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