Perl에서 NAN 또는 Infinity를 어떻게 생성하거나 테스트합니까?

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

  •  19-09-2019
  •  | 
  •  

문제

Perl에서 NAN 또는 무한 값을 생성하거나 테스트하려면 어떻게해야합니까?

도움이 되었습니까?

해결책 2

다음은 상당히 신뢰할 수있는 방법입니다.

my $inf    = 9**9**9;
my $neginf = -9**9**9;
my $nan    = -sin(9**9**9);

sub isinf { $_[0]==9**9**9 || $_[0]==-9**9**9 }
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
# useful for detecting negative zero
sub signbit { substr( sprintf( '%g', $_[0] ), 0, 1 ) eq '-' }

for my $num ( $inf, $neginf, $nan ) {
   printf("%s:\tisinf: %d,\tisnan: %d,\tsignbit: %d\n", $num, isinf($num), isnan($num), signbit($num));
}

출력은 다음과 같습니다.

inf:    isinf: 1,   isnan: 0,   signbit: 0
-inf:   isinf: 1,   isnan: 0,   signbit: 1
nan:    isinf: 0,   isnan: 1,   signbit: 0

다른 팁

print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';

편집하다: 부정적인 무한대로 수정되었습니다.

사용 데이터 :: 플로트 CPAN에서. 다음 기능을 내 보냅니다.

  • float_is_infinite()
  • float_is_nan()
  • ...

여기에 게시 된 다른 반 작업 솔루션과는 달리 테스트 스위트.

개인적으로 나는 사용할 것입니다 Math::BigFloat (또는 BigInt) 무한대를 만질 모든 것에 대해 NaN.

작업을 수행하는 모듈이 이미있을 때 해킹 솔루션으로 휠을 재창조하는 이유는 무엇입니까?

검색했을 때이 사이트를 얻었고 (여기) http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

링크 된 기사는 "Nan"== "Nan"은 NAN이 스스로 일치 할 수 없기 때문에 NAN을 지원할 때 "NAN"== "NAN"은 결코 사실이 아니라고 지적합니다.

이것은 멋지게 설명되어 있습니다

die "This perl does not support NaN!\n" if "NaN" == "NaN";

Perl이 우아하게 저하 된 환경에서 코드를 실행할 위험이 있고 코드가 충분히 낮지 않아서 너무 걱정하지 않아도됩니다.

물론 Perl이 숫자로 보간되는 것을 원하지 않는다면 'EQ'가 아닌 '=='를 사용하십시오.

작동하는 간결한 답변은 다음과 같습니다.

1 : 출력을위한 "NAN"변수를 만드는 방법 (예 : printf) :

 {no strict 'subs'; $NAN="NAN"+1;}

2 : "NAN"을 테스트하는 방법 (ASCII 예술처럼 보입니다) :

 sub isnan {!($_[0]<=0||$_[0]>=0)}

3 : "inf"및 infn 변수를 만드는 방법 :

{$INF="INF"+1; $INFN=-"INF"+1}

4 : "inf"(모든 부호)를 테스트하는 방법 :

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top