2013-11-04 57 views
0

我想我知道如何将十进制数转换为IEEE 754单精度浮点表示,但我想确保。将大十进制数转换为浮点表示

我想表示IEEE 754单精度浮点表示中的3.398860921 x 10^18。我知道如何浮动代表。细分。

31日位:符号(0 +和1为 - ) 30-23th位数:表示指数 22-0th位数:表示尾数(有效位数)

所以签署显然是0,因为它是一个正数。对于指数我想出了这一点(通过添加18到127的偏差),并将指数表示为:1001 0001

对于尾数是3.398860921的部分,我不断将所有东西都乘以小数点右边如果它大于1,我将标记为1,否则为0.然后拿出新的答案,再次将所有内容都乘以小数点右边的2,直到我找到足够的位来填充尾数。

所以现在我有: 0 | 1001 0001 | 0110 0110 0001 1011 1011 111

所以当我转换成16进制表示,我得到0x48B30DDF但比我开始在3.398860921×10^18

是,应该是这样的或不同数量我在某个地方犯了什么错误?任何帮助将不胜感激。

+0

为什么“加18”?指数是两个,而不是十个。 –

+0

如果您只需要为实际上是整数的数字执行此操作,首先获取十进制整数字符串表示形式,将其转换为二进制形式,然后将二进制数字打包为浮点数可能会更容易。 –

+0

1)那么我应该添加什么,而不是18到127呢? 2)所以你的意思是“3。398860921000000000“,并将其转换为二进制文件? – user2516663

回答

1

您不能对IEEE 754表示使用十进制指数。 IEEE 754需要一个二进制指数,即数字表示为1.xxx时的数字p ... * 2 p

而且你不能使用直接转换为二进制的小数科学记数法中的尾数,因为它只对小数指数有意义,不能直接使用。

该算法是将整个数字转换为二进制,然后,然后,只有有效数字,采取跟随领先位的23位。对于指数,计数前导位的位置。

对于3.398860921×10 ,二进制表示的特定值是1.0111100101011001011011111111111101101001010010111101×2 根据Wolfram Alpha

这意味着无偏指数为61,且省略前导位的暂定有效位数为01111001010110010110111。你可以计算从十进制到浮点转换的误差为0.0000000000000000000000011111111101101001010010111101×2 ,并且由于这个误差大于ULP的一半,所以除非你有理由倾向于向下舍入,否则应该为为了获得与原始数字最接近的单精度值(以十进制表示)。

+0

我得到127-61来计算指数?我仍然感到困惑。我得到的最终答案是这样的: 0 | 0100 0000 | 1011 1100 1010 1100 1011 1111 是否正确? – user2516663

+1

答案,假设您需要将偏差加到无偏指数上,得到小数点188,二进制数10111100.指数的LSB是第三个十六进制数字的MSB,剩余的位数为1011110,前面是零符号位,形成前导0x5e,向上舍入将有效位增加1,从01111001010110010110111增加到01111001010110010111000,0x3CACB8。 –

相关问题