2009-07-26 3 views

답변

12

여기에 상당히 안정적인 방법 :

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 
+5

, 단지 0+ "유모"를 사용, 펄이 숫자로 보간하지 않으려면 물론 , 0+ "inf"또는 0 + "- inf"작업도 가능합니다. – ysth

+1

매우 활력이 넘칩니다. 13 분 전에 질문을했습니다. 11 분 전에, 당신은 대답했습니다. 9 분 전, 댓글을 달았습니다. 맥주 등을 사야합니다. – Telemachus

+0

@ 텔레 마커스 : 나는 그 재료를 마시지 않는다는 것을 제외하면 ... – ysth

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

편집 : 음의 무한대에 대한 수정되었습니다.

+0

이 답변에 투표 한 사람은 부끄러워하지 않으면 게시를 떠나게하십시오. 이 방법은 perl에서 완벽하게 작동합니다. $ a가 문자열 표현보다 숫자이면 NaN 또는 Inf 값일 경우에만 'nan'또는 'inf'가됩니다. –

+0

$ a가 숫자가 아니고 실제로 "nan"문자열 인 경우 어떻게해야합니까? –

+0

@ Ryan : 문자열 "nan"은 숫자가 아닙니다. ysth의 솔루션은 정확히 동일하게 작동합니다. 'perl -le 'sub isnan {! 정의 됨 ($ _ [0] <=> 9 ** 9 ** 9)}; 당신이 나를 믿지 않는다면 isnan ("nan") ''을 인쇄하십시오. –

4

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

작업을 수행하는 모듈이 이미있는 경우 왜 해킹 솔루션으로 바퀴를 다시 만들어야합니까?

-3

간결한 답변은 다음과 같습니다.

1

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

2 : (예 printf 함수)의 출력에 대해 "NAN"변수를 만드는 방법 "NAN"에 대한 시험 방법 (ASCII 아트 같다)

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

3 :

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

4 :에 "INF"와 INFN의 변수를 생성하는 방법 (모든 기호) "INF"테스트 방법 :

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")} 
+1

(1)과 (3)은 단지'$ NAN = "NAN"+1;','$ INF = "INF"+1과 다를 바 없습니다. $ INFN = "INF"; 그냥 좀 더 자세한 – ysth

+0

아, (4)는 너무 엄격하게 사용하지 않고 barewords를 사용합니다. 그리고 숫자 문맥에서 "NAN"과 "INF"와 같은 문자열에 의존하는 모든 것들은 이전 perls이나 C 런타임에서 지원하지 않는 경우 (예 : strawberry perl 또는 windows에서의 activeperl) – ysth

+1

에서 실패합니다 _comprehensive_ 대답은 testsuite를 포함합니다. – dolmen

5

CPAN의 Data::Float을 사용하십시오. 그것은 다음과 같은 기능을 보냅니다 반 작업 솔루션은 여기에 게시 된 다른 사람에게

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

과는 달리, 그것은 testsuite 있습니다.

+0

'Data :: Float'의'NaN' 체크는 플랫폼에서의'NaN' 지원에 의존한다는 것을 언급해야합니다. –

0

은 내가 링크 된 문서는 할머니가 자신과 일치 할 수 없기 때문에 기본 C 구현이 NaN을 지원하는 경우 "유모"== "유모가"결코 사실이라고 지적이 (여기) 사이트와 http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

을 가지고 검색하는 경우 .

멋지게 나는 펄이 정상적으로 저하 않은 환경에서 당신에게 코드를 실행하는 위험을 추측

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

로 설명되고 당신은 너무 걱정하지 않도록 코드가 충분히 낮을 수 있습니다되지 않았습니다 .

그리고 당신은 'EQ'하지 '=='C 라이브러리가 지원하는 위의 5.10에

관련 문제