Perl에서 매우 많은 수의 작업을 할 때 과학 표기법을 어떻게 비활성화 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1424317

문제

다음을 고려하세요:

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top