我想我知道如何将十进制数转换为IEEE754单精度浮点表示,但我想确定一下。
我想用IEEE754单精度浮点表示来表示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不同
应该是这样吗?还是我在某个地方犯了错误?任何帮助都将不胜感激。
对于IEEE754表示不能使用十进制指数,IEEE754需要一个二进制指数,即当数字表示为1.xxx时的数字p…*2p。
你不能使用直接转换为二进制的十进制科学记数法的尾数,因为它只对十进制指数有意义,你不能直接使用。
该算法是将整个数字转换为二进制,然后,然后仅对有效数,取前导位之后的23位。对于指数,计算前导位的位置。
对于您的特定值3.398860921 x 1018,根据Wolfram Alpha,二进制表示为1.0111100101011001011011111111111101101001010010111101×261。
这意味着无偏指数是61
,省略前导位的暂定有效数是01111001010110010110111
。您可以计算从十进制到浮点的转换误差为0.0000000000000000000000011111111101101001010010111101×261,由于该误差大于ULP的一半,除非您有理由更喜欢向下舍入,否则您应该在有效数上添加1,以便获得与以十进制表示的原始数最接近的单精度值。