Как получить число с плавающей запятой, передав его шестнадцатеричный эквивалент (формат IEEE) в Perl? - PullRequest
0 голосов
/ 12 июня 2018

Я знаю, что 10.51200 сохраняется в памяти как 0x4025065220000000 с использованием формата IEEE с плавающей запятой.Но когда я передаю это функции sprintf () в Perl, как показано ниже, я получаю неверное значение в качестве вывода.Подскажите, пожалуйста, где я ошибаюсь.

$ temp = 0x4025065220000000;

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

print "$ temp1";

Вывод:

с плавающей точкой: 4622107541822767104.000000

1 Ответ

0 голосов
/ 12 июня 2018

Насколько я могу судить, 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
...