Perl에서 NAN 또는 Infinity를 어떻게 생성하거나 테스트합니까?
문제
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")}