将 Excel 单元格中的数字转换为 IEEE 754 十六进制格式
Convert number From Excel cell to IEEE 754 Hex format
最近我一直在为 Excel 苦恼,因为一个数字的 15 位有效数字显示限制。我一直在寻找一种方法来显示 Excel 单元格中包含的值的 IEEE 754 格式( 因为它们 documented 以这种方式工作 )。
我更愿意 而不是 依靠 VBA 来完成这个项目(尽管如果 memcpy
-类似的解决方案是可能的).
关于我当前的实施,请参阅下面的回答。任何输入或替代表示赞赏。我选择相信我错过了一个更简单、经过充分测试的解决方案。
以下序列允许我使用 Excel 公式将数字转换为其 IEEE 754 十六进制表示。
我没有尝试处理除 0 之外的任何异常。从单元格 A1 到 G1:
A1: 0.123456
B1: =INT(LOG(ABS(A1);2))
指数
C1: =ABS(A1)/(2^B1)
尾数
D1: =(C1-1)*(2^52)
将尾数转换为十进制
E1: =DEC2HEX(1023+B1+IF(A1<0;2^11;0))
将符号和指数转换为十六进制
F1: =CONCATENATE(DEC2HEX(D1/2^32;5);DEC2HEX(MOD(D1;2^32);8))
将十进制转换为十六进制。
G1: ="0x"&IF(A1=0;0;E1&F1)
我的一些结果:
- 22222.0948199999 > 0x40D5B3861187E7A5
=1.35632902954101*2^14
> 0x40D5B3861187E7A7
- 22222.09482 > 0x40D5B3861187E7C0
- 0.000123456 > 0x3F202E7EF70994DD
- 1E+307 > 0x7FAC7B1F3CAC7433
- -35.3 > 0xC041A66666666666
- 1 > 0x3FF0000000000000
编辑:跟进 chux 评论。
我们可以看到,由于舍入错误,以下值给出了错误的结果:
=255+0,9999999999999
> 0x40700000FFFFFFFE
在这种情况下,在步骤 D1 中给出的值为负数。如果我使用此信息来更新我的指数,我的结果似乎是一致的:
=255+0,9999999999999
> 0x406FFFFFFFFFFFFFC
这是更新后的 B1 公式:
- B1:
=IF((ABS(A1)/(2^INT(LOG(ABS(A1);2)))-1)*(2^52)<0;INT(LOG(ABS(A1);2))-1;INT(LOG(ABS(A1);2)))
最近我一直在为 Excel 苦恼,因为一个数字的 15 位有效数字显示限制。我一直在寻找一种方法来显示 Excel 单元格中包含的值的 IEEE 754 格式( 因为它们 documented 以这种方式工作 )。
我更愿意 而不是 依靠 VBA 来完成这个项目(尽管如果 memcpy
-类似的解决方案是可能的).
关于我当前的实施,请参阅下面的回答。任何输入或替代表示赞赏。我选择相信我错过了一个更简单、经过充分测试的解决方案。
以下序列允许我使用 Excel 公式将数字转换为其 IEEE 754 十六进制表示。 我没有尝试处理除 0 之外的任何异常。从单元格 A1 到 G1:
A1:
0.123456
B1:
=INT(LOG(ABS(A1);2))
指数C1:
=ABS(A1)/(2^B1)
尾数D1:
=(C1-1)*(2^52)
将尾数转换为十进制E1:
=DEC2HEX(1023+B1+IF(A1<0;2^11;0))
将符号和指数转换为十六进制F1:
=CONCATENATE(DEC2HEX(D1/2^32;5);DEC2HEX(MOD(D1;2^32);8))
将十进制转换为十六进制。G1:
="0x"&IF(A1=0;0;E1&F1)
我的一些结果:
- 22222.0948199999 > 0x40D5B3861187E7A5
=1.35632902954101*2^14
> 0x40D5B3861187E7A7- 22222.09482 > 0x40D5B3861187E7C0
- 0.000123456 > 0x3F202E7EF70994DD
- 1E+307 > 0x7FAC7B1F3CAC7433
- -35.3 > 0xC041A66666666666
- 1 > 0x3FF0000000000000
编辑:跟进 chux 评论。
我们可以看到,由于舍入错误,以下值给出了错误的结果:
=255+0,9999999999999
> 0x40700000FFFFFFFE
在这种情况下,在步骤 D1 中给出的值为负数。如果我使用此信息来更新我的指数,我的结果似乎是一致的:
=255+0,9999999999999
> 0x406FFFFFFFFFFFFFC
这是更新后的 B1 公式:
- B1:
=IF((ABS(A1)/(2^INT(LOG(ABS(A1);2)))-1)*(2^52)<0;INT(LOG(ABS(A1);2))-1;INT(LOG(ABS(A1);2)))