hat das gleiche Problem mit diesem Code:
#!/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);
}
Die letzten beiden Zeilen in dem Druck:
2^ 63 = -4611686018427387904 to 4611686018427387904 or -9223372036854775808
2^ 64 = -9223372036854775808 to -9223372036854775808 or -1
Offensichtlich nicht richtig, und nicht zu realisieren, dass die% d-Konvertierung das Problem verursacht, habe ich die Lösung hier markiert versucht:
#!/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);
}
Das war, als ich erkannte, dass die printf 'd' Konvertierung ein Problem verursachte. Lesen auf Math :: BigInt es scheint darauf hinzudeuten, dass diese Zahlen als Strings innerhalb gespeichert sind, so zu ändern, um ein ‚s‘ Umwandlung, das Problem behoben:
#!/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);
}
nun die letzten beiden richtig gedruckten Linien:
2^ 63 = -4611686018427387904 to 4611686018427387904 or 9223372036854775808
2^ 64 = -9223372036854775808 to 9223372036854775808 or 18446744073709551616
Aber in Bezug auf Karel Antwort, die IMHO fast korrekt war, könnte dies auch ohne die Verwendung von BigInt (bigint, BigNum, ... getan werden)) Durch die ‚f‘ Umwandlung verwenden, aber mit der Präzision auf ‚0‘ gesetzt, diese Dezimalstellen zu beseitigen:
#!/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);
}
Dies gilt auch für die Frage des OP funktioniert:
perl -e 'printf "%.0f\n", 3 ** 333'
760988023132059813486251563646478824265752535077884574263917414498578085812167738721447369281049109603746001743233145041176969930222526036520619613114171654144
Ace. Genau das, was ich brauchte. –