我想我知道如何将十进制数转换为IEEE 754单精度浮点表示,但我想确定。
我想在IEEE 754单精度浮点表示中表示3.398860921 x 10 ^ 18。我知道如何浮动代表。被打破了。
第31位:符号(0表示+,1表示 - ) 30-23位数:代表指数 第22-0位:代表尾数(有效数字)
所以这个标志显然为0,因为它是一个正数。对于指数,我想出了这个(通过为偏差添加18到127)并将指数表示为:1001 0001
对于尾数,它将是3.398860921部分,我不断将小数点右边的所有数字乘以2,如果它大于1,我标记为1,否则为0.然后采用新的答案再次成倍增加小数点右边的所有内容都是2,直到我想出足够的位来填充尾数。
所以现在我有: 0 | 1001 0001 | 0110 0110 0001 1011 1011 111
因此,当我将其转换为HEX时,我得到的是0x48B30DDF,但这与我在3.398860921 x 10 ^ 18中开始的数字不同
这应该是那样的还是我在某个地方犯了错误?任何帮助将不胜感激。
答案 0 :(得分:1)
您不能将小数指数用于IEEE 754表示。 IEEE 754期望二进制指数,即当数字表示为1.xxx ... * 2 p 时的数字p。
并且你不能使用直接转换为二进制的十进制科学记数法中的尾数,因为它只对十进制指数有意义,你不能直接使用。
该算法将整个数字转换为二进制,然后仅对有效数字转换为前导位后面的23位。对于指数,计算前导位的位置。
对于您的特定值3.398860921 x 10 18 ,根据Wolfram Alpha,二进制表示为1.0111100101011001011011111111111101101001010010111101×2 61 。
这意味着无偏指数为61
,省略前导位的暂定有效数为01111001010110010110111
。您可以计算从十进制到浮点的转换误差为0.0000000000000000000000011111111101101001010010111101×2 61 ,并且由于此误差大于ULP的一半,您应该,除非您有理由倾向于向下舍入,在有效数字中加一,以获得最接近原始数字的单精度值,如十进制表示。