Perl에서 매우 많은 수의 작업을 할 때 과학 표기법을 어떻게 비활성화 할 수 있습니까?
-
07-07-2019 - |
문제
다음을 고려하세요:
print 3 ** 333; #Yields 7.6098802313206e+158
내 질문은 간단합니다. 매우 많은 숫자로 작업 할 때 과학 표기법을 어떻게 비활성화 할 수 있습니까? 기본적으로 모든 숫자가 stdout
구두.
이게 가능해?
해결책
보다 Math::BigInt
use Math::BigInt;
$x = Math::BigInt->new("3");
print $x ** 333;
산출:
760988023132059809720425867265032780727896356372077865117010037035791631439306199613044145649378522557935351570949952010001833769302566531786879537190794573523
다른 팁
프로그램의 모든 정수에 대해 수행하려면 다음을 추가 할 수 있습니다.
use bigint;
정수를 위해서만하고 싶다면 수학 :: bigint 사물.
도 있습니다 Bignum 그리고 수학 :: bignum 플로트와 함께 일하는 경우.
매우 작은 값은 다음 코드를 참조하십시오.
my $value = 1e-07; # = 0.0000001
# NOPE
print $value; # prints 1e-07, $value is a number
print sprintf("%f", $value); # prints 0, $value is a number
print sprintf("%.10f", $value); # prints 0.0000001000, $value is a number
$value = sprintf("%.10f", $value);
print $value # prints 1e-07, $value is a number
# /NOPE
use bignum;
$value = ($value+0)->bstr();
print $value; # prints 0.0000001, $value is a string
no bignum;
print $value; # prints 0.0000001, $value is a string
# HOORAY
숫자가 큰 숫자는 숫자를 저장하는 데 사용되는 정밀도보다 더 많은 자릿수를 가질 수 있습니다. (간단한 실행 가능한 예를 보면이 질문이 해결되었을 것입니다).
150 개 이상의 모든 자리를 모두 볼 필요가 있다면 Bigint (정수), Bigrat (Rational Numbers) 및 Bignum (부동 소수점 번호) 모듈을 사용해야합니다.
이 코드와 동일한 문제가있었습니다.
#!/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 );
}
인쇄하는 마지막 두 줄 :
2 ^ 63 = -4611686018427387904 to 4611686018427387904 or -9223372036854775808
2 ^ 64 = -9223372036854775808 to -9223372036854775808 or -1
분명히 옳지 않으며 %D 변환이 문제를 일으킨다는 사실을 깨닫지 못하면 여기에 플래그를 지정했습니다.
#!/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 );
}
그때 나는 printf 'd'변환이 문제를 일으킨다는 것을 깨달았습니다. Math :: Bigint에 대한 읽기이 숫자는 내부에 문자열로 저장되어 '' '변환으로 바꾸려면 문제를 해결하는 것으로 보입니다.
#!/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 );
}
이제 마지막 두 줄이 올바르게 인쇄되었습니다.
2 ^ 63 = -4611686018427387904 to 4611686018427387904 or 9223372036854775808
2 ^ 64 = -9223372036854775808 to 9223372036854775808 or 18446744073709551616
그러나 거의 올바른 IMHO 인 Karel의 대답과 관련하여, 이것은 'f'변환을 사용하여 Bigint (bigint, bignum, ...)를 사용하지 않고 '0'으로 설정하여 '0'으로 설정하여 제거 할 수 있습니다. 그 소수점 :
#!/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 );
}
이것은 OP의 질문에도 적용됩니다.
perl -e 'printf "%.0f\n", 3 ** 333'
760988023132059813486251563646478824265752535077884574263917414498578085812167738721447369281049109603746001743233145041176969930222526036520619613114171654144