LINUX.ORG.RU

Perl, большие числа


0

0

my @packCharacters    = ('0'..'9', 'A'..'Z');
my %unpackCharacters;
my $decimalValue = 0;
map { $unpackCharacters{$_} = $decimalValue++ } @packCharacters;

sub packLongId
{
    my $id         = shift;
    my $base       = scalar @packCharacters;
    my $packedId   = '';
    for ( my $currentValue = $id; $currentValue > 0; $currentValue = int($currentValue / $base) )
    {
	$packedId .= $packCharacters[ $currentValue % $base ];
    }

    return join "", reverse split //, $packedId;
}

sub unpackLongId
{
    my $packedId     = shift;
    my $base         = scalar @packCharacters;
    my $id           = 0;
    my $currentPower = 1;
    map
    {
	$id           += $unpackCharacters{$_} * $currentPower;
	$currentPower *= $base;
    } reverse split //, $packedId;

    return $id;
}

Переводит, вроде, нормально, но на больших числах начинает лажать.
packLong(11764992501273288845) => 2HDUTRXH5G84T
unpackLong("2HDUTRXH5G84T") => 11764992501273290285 ???

Накопал в цпане Math::BaseCalc, но он лажает точно так же

перл считает большие числа в e* приближении, поэтому и лажает. мне тоже пришлось с этим столкнуться, решил дело пейтоном =)

asgard
()
Ответ на: комментарий от vilfred

> Math::BigInt

> perldoc bignum

Пробовал, безрезультатно :(

swizard
() автор топика

Ну какие же это "Большие числа", обычный unsigned long int на любой вменяемой платформе. Большие - это когда циферок тысячи две-четыре, это да, реально "большие".

Gharik
()

bc -l использовать не сюдьба ?

vtVitus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.