如何通过在Perl中传递其十六进制等效(IEEE格式)来获取浮点数?

时间:2018-06-12 09:48:30

标签: perl ieee-754

我知道10.51200使用IEEE浮点格式在内存中保存为0x4025065220000000。但是当我将它传递给Perl中的sprintf()函数时,如下所示,我得到错误的值作为输出。你能告诉我哪里出错了。

$ temp = 0x4025065220000000;

$ temp1 = sprintf(" float:%f \ n",$ temp);

print" $ temp1&#34 ;;

输出:

float:4622107541822767104.000000

1 个答案:

答案 0 :(得分:4)

据我所知,0x4025065220000000为10.51235,而非10.51200 - 即0x40250624dd2f1aa0。无论如何,请参阅pack

$ perl -wMstrict -le 'print unpack("d>",pack("q>",0x4025065220000000))'
Hexadecimal number > 0xffffffff non-portable at -e line 1.
10.5123453140259
$ perl -wMstrict -le 'print unpack("H*",pack("d>",10.51200))'
40250624dd2f1aa0
$ perl -wMstrict -le 'print unpack("d>",pack("q>",0x40250624dd2f1aa0))'
Hexadecimal number > 0xffffffff non-portable at -e line 1.
10.512

请注意,必须编译Perl以支持上面的四边形(参见perl -V的输出)。如果你不喜欢这个警告,你可以改用字符串:

$ perl -wMstrict -le 'print unpack("d>",pack("H*","4025065220000000"))'
10.5123453140259
$ perl -wMstrict -le 'print unpack("d>",pack("H*","40250624dd2f1aa0"))'
10.512