avuto lo stesso problema con questo codice:
#!/usr/bin/perl
use strict;
use warnings;
print "Base Exp MAX Signed-Negitive MAX Signed-Positive MAX Unsigned\n";
for(my $x = 1; $x <= 64; $x++) {
my $y = (2 ** $x);
printf("2^%4d = %20d to %-20d or %20d\n",
$x, $y/-2, $y/2, $y);
}
Le ultime due righe dove stampa:
2^ 63 = -4611686018427387904 to 4611686018427387904 or -9223372036854775808
2^ 64 = -9223372036854775808 to -9223372036854775808 or -1
Ovviamente non è giusto, e non rendendomi conto che la conversione% d stava causando il problema, ho provato la soluzione contrassegnata qui:
#!/usr/bin/perl
use strict;
use warnings;
use Math::BigInt;
print "Base Exp MAX Signed-Negitive MAX Signed-Positive MAX Unsigned\n";
for(my $x = Math::BigInt->new('1'); $x <= 64; $x++) {
my $y = Math::BigInt->new(2 ** $x);
printf("2^%4d = %20d to %-20d or %20d\n",
$x, $y/-2, $y/2, $y);
}
Ecco quando ho capito che la conversione di "d" di stampa stava causando un problema. Leggendo su Math :: bigint sembra suggerire che questi numeri sono memorizzati come stringhe all'interno, in modo da passare a una conversione 's', risolto il problema:
#!/usr/bin/perl
use strict;
use warnings;
use Math::BigInt;
print "Base Exp MAX Signed-Negitive MAX Signed-Positive MAX Unsigned\n";
for(my $x = Math::BigInt->new('1'); $x <= 64; $x++) {
my $y = Math::BigInt->new(2 ** $x);
printf("2^%4s = %20s to %-20s or %20s\n",
$x, $y/-2, $y/2, $y);
}
Ora le ultime due righe stampate correttamente:
2^ 63 = -4611686018427387904 to 4611686018427387904 or 9223372036854775808
2^ 64 = -9223372036854775808 to 9223372036854775808 or 18446744073709551616
Ma per quanto riguarda la risposta di Karel, che era quasi corretta IMHO, questo potrebbe anche essere fatto senza l'uso di BigInt (bigint, BigNum, ...) Utilizzando la conversione 'f', ma con la precisione impostato a '0' per eliminare quei decimali:
#!/usr/bin/perl
use strict;
use warnings;
print "Base Exp MAX Signed-Negitive MAX Signed-Positive MAX Unsigned\n";
for(my $x = 1; $x <= 64; $x++) {
my $y = (2 ** $x);
printf("2^%4d = %20.0f to %-20.0f or %20.0f\n",
$x, $y/-2, $y/2, $y);
}
Questo funziona anche per la domanda del PO:
perl -e 'printf "%.0f\n", 3 ** 333'
760988023132059813486251563646478824265752535077884574263917414498578085812167738721447369281049109603746001743233145041176969930222526036520619613114171654144
Ace. Proprio quello di cui avevo bisogno. –