Как распаковать значение двойной точности в Perl? - PullRequest
1 голос
/ 30 ноября 2011

Из этого вопроса:

bytearray - Perl pack / unpack и длина двоичной строки - Переполнение стека

Я узнал, что @unparray = unpack("d "x5, $aa); в приведенном ниже фрагменте приводит к строковым элементам в unparray, а не к числам с двойной точностью (как я ожидал).

Можно ли каким-то образом получить массив значений двойной точности из строки байтов $aa в приведенном ниже фрагменте кода:

$a = pack("d",255);
print length($a)."\n";
# prints 8

$aa = pack("ddddd", 255,123,0,45,123);
print length($aa)."\n";
# prints 40

@unparray = unpack("d "x5, $aa);
print scalar(@unparray)."\n";
# prints 5

print length($unparray[0])."\n" 
# prints 3

printf "%d\n", $unparray[0] '
# prints 255

# one liner:
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("ddddd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n" '

Большое спасибо заранее за любые ответы,
Ура!

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Что заставляет вас думать, что оно не хранится как двойное число?

use feature qw( say );

use Config      qw( %Config );
use Devel::Peek qw( Dump );

my @a = unpack "d5", pack "d5", 255,123,0,45,123;

say 0+@a;             # 5
Dump $a[0];           # NOK (floating point format)
say $Config{nvsize};  # 8 byte floats on this build
3 голосов
/ 30 ноября 2011

Извините, но вы неправильно поняли ответ Хоббса на свой предыдущий вопрос.

$unparray[0] - это значение с плавающей запятой двойной точности; но length не похож на (скажем) оператор C sizeof и не сообщает вам размер его аргумента. Скорее, он преобразует свой аргумент в строку, а затем сообщает вам длину этой строки.

Например, это:

my $a = 3.0 / 1.5;
print length($a), "\n";

напечатает это:

1

, потому что он устанавливает $a в 2.0, который становится строковым как 2, который имеет длину 1.

...