Длинный тип данных Perl - PullRequest
       11

Длинный тип данных Perl

2 голосов
/ 24 января 2011

Я пишу приложение на Perl, которое требует длинный тип данных вместо целых чисел.Как я могу этого добиться.Например;

my $num = sprintf('%ld', 27823221234);

print $num;

Вывод не длинное, а целое.

Ответы [ 4 ]

12 голосов
/ 24 января 2011

Ваши варианты:

  • использовать Perl, скомпилированный для 64 бит
  • использование Math :: Int64
  • использовать Math :: BigInt

Обновление: ах, вы также можете использовать числа с плавающей точкой вместо целых:

printf("%.0f", 2**50)

IIRC, на большинстве современных архитектур, числа с плавающей точкой могут представлять целые числа с точностью до 2 ** 54-1.

1 голос
/ 24 января 2011

Вы, вероятно, запутались. Perl изначально поддерживает целочисленную математику «длинного» размера, но я не думаю, что ее внутреннее представление - то, где ваша проблема. Как вы ожидаете, что ваш результат будет выглядеть?

1 голос
/ 24 января 2011

Вот код, который иллюстрирует некоторые особенности поведения Perl - полученный из вашего примера:

use strict;
use warnings;

my $num = sprintf("%ld", 27823221234);
print "$num\n";

my $val = 27823221234;
my $str = sprintf("%ld", $val);
printf "%d = %ld = %f = %s\n", $val, $val, $val, $val;
printf "%d = %ld = %f = %s\n", $str, $str, $str, $str;

Для 64-битного Perl это дает:

27823221234
27823221234 = 27823221234 = 27823221234.000000 = 27823221234
27823221234 = 27823221234 = 27823221234.000000 = 27823221234

Если выдействительно нужно большое число (сотни цифр), а затем загляните в модули, которые их поддерживают.Например:

1 голос
/ 24 января 2011

в вашем случае 27823221234 действительно представляется как double, поэтому, когда вы пытаетесь перейти к sprintf, вы получаете -1

my $x = 27823221234;

my $num = sprintf('%lf', $x);

print $num, "\n";

уступает

27823221234.000000

если вы хотите выполнять математические операции с большими целыми числами, рассмотрите возможность использования модуля Math :: Bigint.

...