2009-07-26 12 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

5.10 और ऊपर है, जहां सी पुस्तकालय इसका समर्थन करता है, बस 0+ "नेन" का उपयोग की , 0+ "inf", या 0 + "- inf" भी काम करते हैं। – ysth

+1

आप का बहुत ऊर्जावान: 13 मिनट पहले, आप सवाल पूछते हैं; 11 मिनट पहले, आप इसका उत्तर देते हैं; 9 मिनट पहले, आप एक टिप्पणी पोस्ट करते हैं। आपको खुद को एक बियर या कुछ खरीदना चाहिए। – Telemachus

+0

@Telemachus: सिवाय इसके कि मैं सामान नहीं पीता ... – 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 संख्या है तो नैन या इंफ मान होने पर केवल 'नैन' या 'inf' होगा। –

+0

क्या होगा यदि $ कोई संख्या नहीं है, लेकिन वास्तव में स्ट्रिंग "नैन" है? –

+0

@ रयान: स्ट्रिंग "नैन" पाठ्यक्रम की संख्या नहीं है। ysth का समाधान बिल्कुल वही काम करता है। 'Perl -le 'उप isnan {की जांच करें! परिभाषित ($ _ [0] <=> 9 ** 9 ** 9)}; प्रिंट इस्नान ("नान") '' अगर आप मुझ पर भरोसा नहीं करते हैं। –

4

व्यक्तिगत रूप से, मैं कुछ भी है कि NaN के अनंत को छूने के लिए जा रहा है के लिए Math::BigFloat (या BigInt) का प्रयोग करेंगे।

नौकरी करने वाले पहले से ही मॉड्यूल होने पर एक हैक समाधान के साथ पहिया को फिर से क्यों शुरू करें?

-3

संक्षिप्त उत्तर जो निम्न कार्य करता है।

1:

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

2: उत्पादन के लिए एक "नेन" चर (printf करने के लिए, उदाहरण के लिए) बनाने के लिए कैसे कैसे "नेन" के लिए परीक्षण करने के लिए (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 = - "आईएनएफ"; 'और अधिक verbose – ysth

+0

ओह, मैं देखता हूं (4) केवल सख्त अक्षम किए बिना, केवल पासवर्ड का उपयोग करता है। और ये सभी जो "एनएएन" और "आईएनएफ" जैसे तारों पर भरोसा करते हैं, संख्यात्मक संदर्भ में उचित "संख्या" बनने से पुराने बीआरएल पर असफल हो जाएगा या जहां सी रनटाइम इसका समर्थन नहीं करता है (उदाहरण के लिए स्ट्रॉबेरी पर्ल या विंडोज़ पर सक्रियपर) – ysth

+1

एक _comprehensive_ उत्तर में एक परीक्षण शामिल होगा। – dolmen

5

CPAN से उपयोग Data::Float। यह निम्नलिखित कार्यों का निर्यात करता है:

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

और विपरीत दूसरों आधा काम कर समाधान यहां पोस्ट की गई, यह एक testsuite है।

+0

यह उल्लेख किया जाना चाहिए कि 'NaN' के लिए डेटा :: फ्लोट की जांच मंच पर' NaN' समर्थन पर निर्भर है। –

0

जब मैं मैं इस साइट (यहाँ) और http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

मिला जुड़ा हुआ लेख बताते हैं कि "नेन" == "नेन" कभी नहीं सच है, अंतर्निहित ग कार्यान्वयन NaN का समर्थन करता है जब क्योंकि नेन ही मेल नहीं खा सकता है की खोज ।

यह अच्छी तरह से

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

से दिखाया गया है मैं ऐसा माहौल पर्ल शान से अपमानित किया गया है में आप कोड रुक जाने का जोखिम लगता है और अपने कोड काफी कम इतना है कि आप बहुत ज्यादा चिंता मत करो नहीं हो सकता है ।

और हां अगर आप पर्ल एक संख्या के रूप अंतर्वेशन नहीं करना चाहते, 'eq' नहीं '=='

संबंधित मुद्दे