كيف أقوم بإنشاء أو اختبار نان أو إنفينيتي في بيرل؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

كيف يمكنني إنشاء أو اختبار لقيم نان أو لا حصر لها في بيرل؟

هل كانت مفيدة؟

المحلول 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 البريد الإلكتروني.com/2015/05/Perls-Special-not-a-numbers/

تشير المقال المرتبط إلى أن "NAN" == "NAN" غير صحيح أبدا، عندما يدعم التنفيذ الأساسي C NAN لأن NAN لا يمكن أن تتطابق مع نفسه.

هذا هو موضح بشكل جيد مع

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

أعتقد أن خطر تشغيل رمزك في بيئة حيث تدهورت بيرل بأمان وعدم وجود الكود الخاص بك منخفضا بدرجة كافية حتى لا تقلق كثيرا.

وبالطبع إذا كنت لا تريد perl to interpolate كرقم، فاستخدم "EQ" لا "=="

إجابة موجزة التي تعمل على ذلك.

1: كيفية إنشاء متغير "NAN" للإخراج (إلى Printf، على سبيل المثال):

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

2: كيفية اختبار ل "نان" (يشبه فن 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