NaN

مثال على ظهور NaN كخطأ حسابي عند إدخال N/A في التنبؤات الجوية الإلكترونية

في مجال الحوسبة ، NaN ( تُنطق / næn / ) ، اختصارًا لـ " ليس رقمًا" ، هي قيمة معينة من نوع بيانات رقمي (غالبًا ما يكون عددًا عشريًا ) غير مُعرَّفة كرقم، مثل نتيجة00{\displaystyle {\frac {0}{0}}}تم إدخال الاستخدام المنهجي لـ NaNs بواسطة معيار IEEE 754 للفاصلة العائمة في عام 1985، إلى جانب تمثيل الكميات غير المحدودة الأخرى مثل اللانهاية .

في الرياضيات ، نتيجة00{\displaystyle {\frac {0}{0}}}لا يتم تعريفها عادةً كرقم [ a ] وبالتالي يمكن تمثيلها بواسطة NaN في أنظمة الحوسبة.

الجذر التربيعي لعدد سالب ليس عددًا حقيقيًا ، ولذلك يُرمز إليه أيضًا بـ NaN في أنظمة الحوسبة المتوافقة. ويمكن استخدام NaN أيضًا لتمثيل القيم المفقودة في العمليات الحسابية. [ 1 ] [ 2 ]

يُوفّر النظام نوعين منفصلين من القيم غير الرقمية (NaNs)، وهما القيم غير الرقمية الصامتة والقيم غير الرقمية المُشيرة . تُستخدم القيم غير الرقمية الصامتة لنشر الأخطاء الناتجة عن العمليات أو القيم غير الصالحة. أما القيم غير الرقمية المُشيرة، فتدعم ميزات متقدمة مثل دمج العمليات الحسابية العددية والرمزية ، أو غيرها من التوسعات في العمليات الحسابية الأساسية ذات الفاصلة العائمة.

الفاصلة العائمة

في حسابات الفاصلة العائمة، لا تُعتبر NaN مرادفةً لللانهاية ، على الرغم من أن كلتيهما تُعاملان عادةً كحالتين خاصتين في تمثيلات الفاصلة العائمة للأعداد الحقيقية، وكذلك في عمليات الفاصلة العائمة. كما أن العملية غير الصالحة لا تُعتبر مرادفةً لفيضان حسابي (الذي يُعيد اللانهاية أو أكبر عدد محدود في القيمة المطلقة) أو لنقص حسابي (الذي يُعيد أصغر عدد طبيعي في القيمة المطلقة، أو عددًا دون الطبيعي ، أو الصفر ).

في تنسيقات التبادل الثنائي IEEE 754 ، يتم ترميز NaNs بحقل الأس المملوء بالواحدات (مثل قيم اللانهاية)، ورقم غير صفري في حقل المعامل اللاحق (لجعلها متميزة عن قيم اللانهاية)؛ وهذا يسمح بتعريف قيم NaN متعددة ومختلفة، اعتمادًا على البتات التي تم تعيينها في حقل المعامل اللاحق، ولكن أيضًا على قيمة بت الإشارة الرئيسي (ولكن التطبيقات غير مطالبة بتوفير دلالات مميزة لتلك القيم NaN المتميزة).

على سبيل المثال، يتم ترميز NaN أحادي الدقة (32 بت) وفقًا لمعيار IEEE 754 على النحو التالي:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

حيث يُمثل s الإشارة (والتي غالبًا ما يتم تجاهلها في التطبيقات)، ويمثل تسلسل x عددًا غير صفري (القيمة صفر تُشير إلى اللانهاية). عمليًا، تُستخدم البتة الأكثر أهمية من x لتحديد نوع NaN: " NaN صامت " أو " NaN إشارة " (انظر التفاصيل في قسم التشفير ). أما البتات المتبقية فتُشفّر حمولة (والتي غالبًا ما يتم تجاهلها في التطبيقات).

عادةً ما تُنتج عمليات الفاصلة العائمة، باستثناء المقارنات المرتبة، قيمة NaN صامتة ( qNaN ). أما معظم عمليات الفاصلة العائمة على قيمة NaN مُشيرة ( sNaN ) فتُشير إلى استثناء العملية غير الصالحة ؛ ويكون الإجراء الافتراضي للاستثناء هو نفسه كما هو الحال مع معاملات qNaN، حيث تُنتج قيمة qNaN إذا كانت النتيجة عددًا عشريًا.

يُتيح انتشار قيم NaN الصامتة خلال العمليات الحسابية اكتشاف الأخطاء في نهاية سلسلة العمليات دون الحاجة إلى اختبارات مُطوّلة خلال المراحل الوسيطة. على سبيل المثال، إذا بدأنا بقيمة NaN وأضفنا 1 خمس مرات متتالية، فإن كل عملية إضافة تُنتج قيمة NaN، ولكن لا داعي للتحقق من كل عملية حسابية لأنه يُمكننا ببساطة ملاحظة أن النتيجة النهائية هي NaN. مع ذلك، وبحسب لغة البرمجة والدالة، يُمكن إزالة قيم NaN بصمت من سلسلة من العمليات الحسابية حيث تُعطي إحدى العمليات في السلسلة نتيجة ثابتة لجميع قيم الفاصلة العائمة الأخرى. على سبيل المثال، قد تُنتج العملية الحسابية x 0 النتيجة 1، حتى عندما تكون x هي NaN، لذا فإن التحقق من النتيجة النهائية فقط سيُخفي حقيقة أن عملية حسابية قبل x 0 قد نتج عنها NaN. بشكل عام، يلزم إجراء اختبار لاحق لعلامة عدم صلاحية المجموعة لاكتشاف جميع الحالات التي تُدخل فيها قيم NaN [ 3 ] (انظر تعريف الدالة أدناه لمزيد من التفاصيل).

في القسم 6.2 من معيار IEEE 754-2008 القديم ، توجد دالتان شاذتان ( maxNumالدالتان minNumاللتان تُرجعان القيمة القصوى والدنيا، على التوالي، لمعاملين يُفترض أن يكونا عددين) تُفضلان الأعداد  - فإذا كان أحد المعاملين NaN، تُرجع الدالة قيمة المعامل الآخر. وقد استبدلت مراجعة IEEE 754-2019 هاتين الدالتين لأنهما ليستا تجميعيتين (عندما يظهر NaN في أحد المعاملين). [ 4 ] [ 5 ]

مقارنة مع NaN

تحدد معايير IEEE 754 المقارنات بحيث تأخذ في الحسبان احتمالية وجود قيم NaN في المعاملات. [ 6 ] عند مقارنة عددين حقيقيين، أو عددين حقيقيين موسعين (كما في صيغ الفاصلة العائمة لمعيار IEEE 754)، قد يكون العدد الأول أصغر من العدد الثاني، أو مساوياً له، أو أكبر منه. وهذا يُعطي ثلاث علاقات محتملة. ولكن عندما يكون أحد معاملات المقارنة على الأقل NaN، لا ينطبق هذا التصنيف الثلاثي، وتُصبح هناك حاجة إلى علاقة رابعة: غير مرتبة . على وجه الخصوص، تُقارن قيمتان NaN على أنهما غير مرتبتين، وليس على أنهما متساويتان.

كما هو محدد، فإن المسندات المرتبطة بـ<{\displaystyle <}،{\displaystyle \leq }،={\displaystyle =}،{\displaystyle \geq }،>{\displaystyle >}تُرجع الرموز الرياضية (أو ما يُعادلها من رموز في لغات البرمجة) القيمة "خطأ" في العلاقات غير المرتبة. على سبيل المثال، " ليس"(x<y){\displaystyle (x<y)}لا يكافئ منطقياًxy{\displaystyle x\geq y}في حالة عدم الترتيب، أي عندماx{\displaystyle x}أوy{\displaystyle y}إذا كانت القيمة NaN، فإن الأولى تُرجع القيمة true بينما تُرجع الثانية القيمة false. ومع ذلك،{\displaystyle \neq }يُعرَّف بأنه نفي={\displaystyle =}وبالتالي، فإنه يُرجع القيمة "صحيح" في حالة عدم الترتيب.

مقارنة بين NaN وأي قيمة عددية عشرية x (بما في ذلك NaN و ±∞)
مقارنةNaN ≥ xNaN ≤ xNaN > xNaN < xNaN = xNaN ≠ x
نتيجةخطأ شنيعخطأ شنيعخطأ شنيعخطأ شنيعخطأ شنيعحقيقي

انطلاقاً من هذه القواعد، بالمقارنةx{\displaystyle x}مع نفسه،xx{\displaystyle x\neq x}أوx=x{\displaystyle x=x}يمكن استخدامها لاختبار ما إذاx{\displaystyle x}هل هو NaN أم غير NaN؟

تكون دوال المقارنة إما مُشيرة أو غير مُشيرة عند استقبال قيم NaN غير المُشار إليها؛ تُشير الدوال المُشيرة إلى استثناء العملية غير الصالحة لهذه المقارنات (أي، افتراضيًا، يتم تعيين علامة الحالة المُناسبة بالإضافة إلى سلوك الدوال غير المُشيرة). دوال المساواة وعدم المساواة غير مُشيرة. جميع دوال المقارنة القياسية الأخرى المرتبطة بالرموز الرياضية المذكورة أعلاه مُشيرة إذا استقبلت قيمة NaN. يوفر المعيار أيضًا دوالًا غير مُشيرة لهذه الدوال الأخرى. تُحدد الدالة ما إذا كانت القيمة NaN ولا تُشير أبدًا إلى استثناء، حتى لوisNaN(x{\displaystyle x})x{\displaystyle x}هو إشارة NaN.

يتطلب معيار IEEE للفاصلة العائمة أن تكون NaN{\displaystyle \neq }يصحّ NaN . في المقابل، يحتوي المعيار الخاص لعام 2022 للحساب الموجب على مفهوم مشابه، وهو NaR (ليس حقيقيًا)، حيث NaR={\displaystyle =}يثبت NaR . [ 7 ]

العمليات التي تولد قيم NaN

هناك ثلاثة أنواع من العمليات التي يمكن أن تُرجع NaN: [ 8 ]

  • معظم العمليات التي تحتوي على معامل واحد على الأقل من نوع NaN.
  • الأشكال غير المحددة :
    • الأقسام(±0)/(±0){\displaystyle (\pm 0)/(\pm 0)}و(±)/(±){\displaystyle (\pm \infty )/(\pm \infty )}.
    • عمليات الضرب(±0)×(±){\displaystyle (\pm 0)\times (\pm \infty )}و(±)×(±0){\displaystyle (\pm \infty )\times (\pm 0)}.
    • الباقيxتعديلy{\displaystyle x{\bmod {y}}}متىx{\displaystyle x}هو اللانهاية أوy{\displaystyle y}يساوي صفرًا.
    • الإضافات(+)+(-){\displaystyle (+\infty )+(-\infty )}،(-)+(+){\displaystyle (-\infty )+(+\infty )}وما يعادلها من عمليات طرح(+)-(+){\displaystyle (+\infty )-(+\infty )}و(-)-(-){\displaystyle (-\infty )-(-\infty )}.
    • دالة الجذر النونيxن{\displaystyle {\sqrt[{n}]{x}}}متىن{\displaystyle n}يساوي صفرًا.
    • الدوال المثلثية على اللانهاية:الخطيئة(±){\displaystyle \sin(\pm \infty )}،كوس(±){\displaystyle \cos(\pm \infty )}،لون برونزي(±){\displaystyle \tan(\pm \infty )}.
    • يعامل المعيار دالة الظل العكسي ذات الوسيطين بشكل خاص: أشكالها غير المحددةatan2(±0،±0){\displaystyle \operatorname {atan2} (\pm 0,\pm 0)}وatan2(±،±){\displaystyle \operatorname {atan2} (\pm \infty ,\pm \infty )}ليست NaN بل مضاعفات مختلفة لـπ/4{\displaystyle \pi /4}.
    • يحتوي المعيار على وظائف بديلة للقوى:
      • تحدد الدالة القياسية powودالة الأس الصحيحpown00{\displaystyle 0^{0}}،1(±){\displaystyle 1^{(\pm \infty )}}، و(±)0{\displaystyle (\pm \infty )^{0}}مثل1{\displaystyle 1}.
      • تُعرّف الدالة powrجميع الأشكال الثلاثة غير المحددة على أنها عمليات غير صالحة، وبالتالي تُرجع NaN.
  • عمليات حقيقية ذات نتائج معقدة ، على سبيل المثال:
    • الجذر التربيعي لعدد سالب.
    • لوغاريتم عدد سالب.
    • الجيب العكسي أو جيب التمام العكسي لعدد أقل من -1 أو أكبر من 1.
    • دالة الجذر النونيxن{\displaystyle {\sqrt[{n}]{x}}}متىx{\displaystyle x}هو عدد سالب ون{\displaystyle n}هو عدد زوجي.
    • لتشغيل الطاقةxy{\displaystyle x^{y}}معx{\displaystyle x}بما أن العدد سالب، فإن الدالة القياسية powوالدوال powrالأخرى تتصرفان بشكل مختلف: powrتُرجع الدالة القياسية دائمًا NaN في هذه الحالة، بينما powتُرجع الدالة الأخرى NaN فقط إذاy{\displaystyle y}ليس عددًا صحيحًا.

يمكن أيضًا إسناد قيم NaN صراحةً إلى المتغيرات، عادةً كتمثيل للقيم المفقودة. قبل معيار IEEE، كان المبرمجون يستخدمون غالبًا قيمة خاصة (مثل -99999999) لتمثيل القيم غير المعرفة أو المفقودة، ولكن لم يكن هناك ما يضمن معالجتها بشكل متسق أو صحيح. [ 1 ]

لا تُولَّد قيم NaN بالضرورة في جميع الحالات المذكورة أعلاه. إذا كان من الممكن أن تُنتج عملية ما حالة استثناء ولم يتم إخفاء المصائد، فستُسبب العملية مصيدة بدلاً من ذلك. [ 9 ] إذا كان أحد المعاملات قيمة NaN صامتة، ولم يكن هناك معامل NaN مُشير، فلن تكون هناك حالة استثناء وستكون النتيجة قيمة NaN صامتة. لن تُسبب عمليات الإسناد الصريحة استثناءً حتى بالنسبة لقيم NaN المُشيرة.

هادئ NaN

بشكل عام، لا تُثير قيم NaN الصامتة، أو qNaN، أي استثناءات إضافية، لأنها تنتقل عبر معظم العمليات. ولكن يتم الإشارة إلى استثناء العملية غير الصالحة بواسطة بعض العمليات التي لا تُرجع قيمة فاصلة عائمة، مثل تحويلات التنسيق أو بعض عمليات المقارنة.

إشارة NaN

تُعدّ قيم NaN المُشار إليها، أو sNaNs، أشكالًا خاصة من NaN، والتي عند استخدامها في معظم العمليات، تُثير استثناء العملية غير الصالحة، ثم تُحوّل، عند الاقتضاء، إلى qNaN الذي قد ينتشر بعد ذلك. وقد طُرحت هذه القيم في معيار IEEE 754. وقد طُرحت عدة أفكار حول كيفية استخدامها.

  • سيؤدي ملء الذاكرة غير المهيأة بقيم NaN للإشارة إلى حدوث استثناء عملية غير صالحة إذا تم استخدام البيانات قبل تهيئتها.
  • استخدام sNaN كعنصر نائب لكائن أكثر تعقيدًا ، مثل:

عند مواجهة خطأ، يمكن لمعالج الاعتراض فك تشفير قيمة sNaN وإرجاع فهرس للنتيجة المحسوبة. عمليًا، يواجه هذا الأسلوب العديد من التعقيدات. فمعالجة بت الإشارة لقيم NaN في بعض العمليات البسيطة (مثل القيمة المطلقة ) تختلف عن معالجتها في العمليات الحسابية. ولا يشترط المعيار وجود اعتراضات.

عمليات الحمولة

توصي مواصفة IEEE 754-2019 بتنفيذ العمليات getPayload و setPayload و setPayloadSignaling ، [ 10 ] لتوحيد الوصول إلى البيانات المرسلة بهدف تبسيط استخدام التطبيقات. [ 11 ] ووفقًا لوثيقة IEEE 754-2019 الأساسية، ينبغي تفسير هذه التوصية على أنها "مطلوبة للتطبيقات الجديدة، مع مراعاة التوافق مع الإصدارات السابقة". [ 12 ]

التشفير

في تنسيقات تبادل البيانات IEEE 754 ، تُعرَّف القيم غير الرقمية (NaN) بأنماط بتات محددة مسبقًا وفريدة من نوعها. لا يُؤخذ بت الإشارة في الاعتبار. أما في التنسيقات الثنائية، فتُمثَّل القيم غير الرقمية (NaN) بحقل الأسّ المملوء بالآحاد (مثل قيم اللانهاية)، وبرقم غير صفري في حقل المعامل اللاحق (لتمييزها عن قيم اللانهاية). وصف  معيار IEEE 754 الأصلي الصادر عام 1985 ( IEEE 754-1985 ) تنسيقات الفاصلة العائمة الثنائية فقط، ولم يُحدد كيفية تمييز حالة الإشارة/السكون. عمليًا، كان البت الأكثر أهمية في حقل المعامل اللاحق هو الذي يُحدد ما إذا كانت القيمة غير الرقمية (NaN) إشارة أم سكون. وقد نتج عن ذلك تطبيقان مختلفان بمعانٍ معكوسة:

  • تقوم معظم المعالجات (بما في ذلك معالجات عائلة x86 من إنتل و AMD ، وعائلة موتورولا 68000 ، وعائلة AIM PowerPC ، وعائلة ARM ، وعائلة Sun SPARC ، ومعالجات MIPS الجديدة الاختيارية ) بتعيين بت الإشارة/الهدوء إلى قيمة غير صفرية إذا كانت قيمة NaN هادئة، وإلى الصفر إذا كانت قيمة NaN تشير. وبالتالي، في هذه المعالجات، يمثل هذا البت علامة .is_quiet
  • في قيم NaN التي تولدها معالجات PA-RISC ومعالجات MIPS القديمة، تكون بتة الإشارة/الهدوء صفرًا إذا كانت قيمة NaN هادئة، وقيمة غير صفرية إذا كانت قيمة NaN تشير إلى حالة معينة. وبالتالي، في هذه المعالجات، تمثل هذه البتة is_signalingعلامة.

تم تفضيل الخيار الأول لأنه يسمح بتنفيذ عملية إسكات إشارة NaN بمجرد ضبط بت الإشارة/الإسكات على 1. أما العكس فلا يمكن مع الخيار الثاني لأن ضبط بت الإشارة/الإسكات على 0 قد يؤدي إلى قيمة لانهائية. [ 13 ]

تُحدد مراجعات عامي 2008 و2019 لمعيار IEEE  754 المتطلبات والتوصيات الرسمية لترميز حالة الإشارة/الهدوء.

  • في تنسيقات التبادل الثنائي، تُستخدم البتة الأكثر أهمية في حقل المعامل اللاحق حصريًا للتمييز بين قيم NaN الصامتة وقيم NaN المُشيرة. [ 14 ] (أُضيف هذا الشرط في مراجعة 2019). علاوة على ذلك، يجب أن تكون هذه البتة بمثابة is_quietعلامة. [ 15 ] أي أن هذه البتة لا تساوي صفرًا إذا كانت قيمة NaN صامتة، وتساوي صفرًا إذا كانت قيمة NaN مُشيرة.
  • في تنسيقات التبادل العشري، سواء كانت مشفرة ثنائياً أو عشرياً، يتم تحديد قيمة NaN من خلال ضبط البتات الخمسة العليا من حقل التركيب بعد بت الإشارة على واحد. أما البت السادس من الحقل فهو بمثابة علامة is_signaling. أي أن هذا البت يكون صفراً إذا كانت قيمة NaN غير نشطة، وغير صفري إذا كانت قيمة NaN تشير إلى شيء ما. [ 16 ]

لضمان  التوافق مع معيار IEEE 754-2008، أصبح بالإمكان الآن ضبط معنى بت الإشارة/الصمت في معالجات MIPS الحديثة عبر حقل NAN2008 في سجل FCSR. هذا الدعم اختياري في إصدار MIPS  3 وإلزامي في الإصدار  5. [ 17 ]

لا يُحدد المعيار حالة البتات المتبقية من حقل المعامل الدال. تُشفّر هذه البتات قيمة تُسمى "حمولة" قيمة NaN. بالنسبة للصيغ الثنائية، يكون التشفير غير مُحدد. أما بالنسبة للصيغ العشرية، فيُستخدم التشفير المعتاد للأعداد الصحيحة غير المُوقّعة. إذا كانت العملية تحتوي على مُدخل NaN واحد وتُمرّره إلى المُخرج، فيجب أن تكون حمولة NaN الناتجة هي حمولة NaN المُدخل (وهذا ليس ممكنًا دائمًا للصيغ الثنائية عندما يتم تشفير حالة الإشارة/الهدوء بواسطة علامة is_signaling، كما هو مُوضح أعلاه). إذا كانت هناك مُدخلات NaN مُتعددة، فيجب أن تكون حمولة NaN الناتجة من إحدى قيم NaN المُدخلة؛ ولا يُحدد المعيار أيها.

NaN الكنسي

تعتمد العديد من الأنظمة مفهوم "القيمة غير الرقمية المعيارية"، حيث تُختار قيمة غير رقمية محددة لتكون القيمة غير الرقمية المعيارية الوحيدة الممكنة الناتجة عن عمليات الفاصلة العائمة التي لا تتضمن مدخلات غير رقمية. وعادةً ما تُختار هذه القيمة لتكون قيمة غير رقمية صامتة ذات حمولة بيانات أصفار بالكامل وبت إشارة مُحدد بشكل عشوائي.

  • في معمارية RISC-V ، تُنتج معظم عمليات الفاصلة العائمة القيمة NaN القياسية فقط، حتى لو تم إدخال NaN كمعامل (لا يتم نشر البيانات). [ 18 ] [ ب ] يمكن لمعمارية ARM تفعيل وضع "NaN الافتراضي" لهذا السلوك. [ 20 ] وتتمتع WebAssembly بالسلوك نفسه، مع أنها تسمح بقيمتين قياسيتين. [ 21 ]
  • لا تُميّز بعض لغات البرمجة بين قيم NaN المختلفة، دون أن تُلزم تطبيقاتها بفرض قيمة NaN مُحددة. يتعامل كود ECMAScript (جافا سكريبت) مع جميع قيم NaN كما لو كانت القيمة نفسها. [ 22 ] وتُعامل جافا القيم بنفس الطريقة "في أغلب الأحيان". [ 23 ]

يُتيح استخدام عدد محدود من تمثيلات NaN للنظام استخدام قيم NaN أخرى محتملة لأغراض غير حسابية، وأهمها "تغليف NaN"، أي استخدام الحمولة لبيانات عشوائية. [ 24 ] (يختلف مفهوم "NaN المعياري" عن مفهوم "الترميز المعياري" في معيار IEEE 754).

تعريف الدالة

توجد اختلافات في الآراء حول التعريف الصحيح لنتيجة دالة عددية تستقبل قيمة NaN صامتة كمدخل. يرى البعض أن قيمة NaN يجب أن تنتقل إلى مخرج الدالة في جميع الحالات للإشارة إلى وجود خطأ. بينما يرى آخرون، وهو الرأي الذي تتبناه معايير ISO  C99 و IEEE  754-2008 عمومًا، أنه إذا كانت للدالة وسائط متعددة وكان المخرج محددًا بشكل فريد من خلال جميع المدخلات غير NaN (بما في ذلك اللانهاية)، فإن تلك القيمة يجب أن تكون هي النتيجة. وبالتالي، على سبيل المثال ، القيمة التي تُرجعها الدالة hypot(±∞, qNaN)هيhypot(qNaN, ±∞)+{\displaystyle +\infty }.

تتفاقم المشكلة بشكل خاص بالنسبة لدالة الأس pow(x, y)=xy{\displaystyle x^{y}}التعبيرات00{\displaystyle 0^{0}}،0{\displaystyle \infty ^{0}}و1{\displaystyle 1^{\infty }}تُعتبر أشكالاً غير محددة عندما تظهر كحدود (تماماً مثل×0{\displaystyle \infty \times 0}) ومسألة ما إذا كان ينبغي تعريف الصفر مرفوعًا للأس صفر على أنه 1 قد أثارت جدلاً واسعاً.

إذا اعتُبرت المخرجات غير مُعرَّفة عندما يكون أحد المعاملات غير مُعرَّف، فيجب pow(1, qNaN)أن تُنتج الدالة قيمة qNaN. مع ذلك، تُعيد المكتبات الرياضية عادةً القيمة 1 لأي ​​عدد حقيقي y ، حتى عندما تكون y لانهائية . وبالمثل، تُنتج القيمة 1 حتى عندما تكون x تساوي 0 أو لانهائية. يكمن الأساس المنطقي لإرجاع القيمة 1 للأشكال غير المُحدَّدة في أن قيمة الدوال عند النقاط الشاذة يُمكن اعتبارها قيمة مُحدَّدة إذا كانت هذه القيمة ضمن نطاق القيمة لجميع القيم باستثناء جزء صغير جدًا من كرة حول القيمة الحدية للمعاملات. ينص إصدار 2008 من معيار IEEE 754 على أنه يجب على كل من الدالتين و إرجاع القيمة 1، لأنهما تُرجعان 1 بغض النظر عن القيمة المُستخدمة بدلاً من NaN. علاوة على ذلك، اختارت ISO C99، ومعيار IEEE 754-2008 اللاحق، تحديد = 1 بدلاً من qNaN. يُذكر سبب هذا الاختيار في منطق لغة C: [ 25 ] "بشكل عام، تتجنب لغة C99 نتيجة NaN حيث تكون القيمة العددية مفيدة. ... نتيجة هي +∞، لأن جميع قيم الفاصلة العائمة الموجبة الكبيرة هي أعداد زوجية صحيحة."pow(1, y)pow(x, 0)pow(1, qNaN)pow(qNaN, 0)  pow(−1, ±∞)pow(−2, ∞)

ولإرضاء أولئك الذين يرغبون في تفسير أكثر صرامة لكيفية عمل دالة القوة، يحدد معيار 2008 دالتين إضافيتين للقوة: ، حيث يجب أن يكون الأس عددًا صحيحًا، و ، والتي تُرجع NaN كلما كان أحد المعاملات NaN أو أن عملية الأس ستعطي شكلًا غير محدد .pown(x, n)powr(x, y)

عدد صحيح NaN

لا تستطيع معظم تنسيقات الأعداد الصحيحة ذات الحجم الثابت الإشارة صراحةً إلى البيانات غير الصالحة. في هذه الحالة، عند تحويل قيمة NaN إلى نوع عدد صحيح، يشترط معيار IEEE 754 الإشارة إلى استثناء العملية غير الصالحة .

على سبيل المثال، في لغة جافا ، تؤدي هذه العمليات إلى إطلاق استثناء java.lang.ArithmeticException. [ 26 ]

في لغة C ، تؤدي هذه العمليات إلى سلوك غير محدد ، ولكن إذا  تم دعم الملحق F، فإن العملية تؤدي إلى استثناء فاصلة عائمة "غير صالح" (كما هو مطلوب بموجب معيار IEEE) وقيمة غير محددة.

في لغة R0x80000000 ، تُحجز أصغر قيمة مُوقّعة (أي NaN ) للأعداد الصحيحة لـ NA(غير متوفر). وبالتالي، فإن التحويل من NaN (أو NA المزدوج) إلى أعداد صحيحة ينتج عنه عدد صحيح.NA

تستخدم حزمة Perl القيمة "NaN" لنتيجة السلاسل النصية التي لا تمثل أعدادًا صحيحة صالحة. [ 27 ]Math::BigInt

> perl -mMath::BigInt -e "print Math::BigInt->new('foo')" NaN

عرض

قد تختلف تمثيلات NaN النصية باختلاف أنظمة التشغيل ولغات البرمجة.

nan (C, C++, Python, Zig) NaN (ECMAScript، Rust، C#، Julia، Java). قد تُظهر Julia قيم NaN بديلة، اعتمادًا على الدقة، NaN32 وNaN16؛ NaN مخصصة لنوع البيانات Float64. NaN% NAN (C، C++، Rust) NaNQ (IBM XL و AIX: اقتراح Fortran و C++ رقم 2290) نان (كما سبق) qNaN سنان 1.#SNAN (Excel) 1.#QNAN (Excel) -1.#IND (Excel) +nan.0 (مخطط)

بما أن القيم غير الرقمية المشفرة عمليًا تحتوي على إشارة، وبت إشارة/صمت، ومعلومات تشخيصية اختيارية (تُسمى أحيانًا حمولة )، فسيتم العثور عليها أحيانًا في تمثيلات السلاسل النصية للقيم غير الرقمية أيضًا. ومن الأمثلة على ذلك:

  • في لغتي C و C++، تُعرض بتة الإشارة دائمًا بواسطة دوال المكتبة القياسية (مثل `c` -nan) عند وجودها. لا يوجد عرض قياسي للحمولة أو لحالة الإشارة، ولكن يمكن إنشاء قيمة NaN صامتة لحمولة معينة إما بتوفير السلسلة لدالة تحليل الأرقام (مثل `c` ) أو بتوفير سلسلة تسلسل الأحرف لـ `c` (أو `c` لـ `sNaN`)، وكلاهما يُفسر بطريقة محددة من قِبل التطبيق. nan(char-sequence)strtodnan()nans()
    • توفر كل من GCC و LLVM تطبيقات مدمجة لـ nan()و nans(). تقوم هذه التطبيقات بتحليل تسلسل الأحرف كعدد صحيح لـ strtoull(أو ما يعادله بحجم مختلف) مع اكتشافها لأساسات الأعداد الصحيحة.
    • يستخدم محلل الأعداد العشرية في مكتبة glibc ( مكتبة GNU C) سلسلة الأحرف بطريقة غير محددة. [ 28 ] عمليًا، كان هذا التحليل مكافئًا لتحليل GCC/LLVM لما يصل إلى 64 بت من البيانات.
    • لا تقوم مكتبة Newlibnan() بتنفيذ عملية التحليل، ولكنها strtod()تقبل تنسيقًا سداسيًا عشريًا بدون بادئة.
    • لا يقوم برنامج musl بتنفيذ أي عملية تحليل للبيانات المرسلة.

لا تسمح جميع اللغات بوجود قيم NaN متعددة. على سبيل المثال، تستخدم لغة ECMAScript قيمة NaN واحدة فقط في جميع لغاتها.

مراجع

ملحوظات

  1. 0/0 غير معرف كرقم في كل من نظام الأعداد الحقيقية ونظام الأعداد الحقيقية الموسعة ، في حين أن 1/±0، على سبيل المثال، يمكن تعيين قيمة ±∞ بشكل متسق في النظام الأخير، بافتراض وجود صفر موقّع .
  2. يوصي معيار IEEE 754-2008، ولكنه لا يشترط، بنشر حمولة NaN. تختار معظم المعالجات اتباع هذه التوصية، ولكنها لا تُولّد حمولة غير صفرية من تلقاء نفسها. [ 19 ] وبالتالي، فإن سلوك RISC-V غير مُوصى به ولكنه متوافق مع المعيار.

الاقتباسات

  1. 1 2 بومان، كينيث (2006). مقدمة في البرمجة باستخدام لغة البيانات التفاعلية (IDL) . دار النشر الأكاديمية. ص 26. ISBN  978-0-12-088559-6.
  2. ↑ بريس، ويليام هـ.؛ تيوكولسكي ، شاول أ.؛ فيترلينغ، ويليام ت.؛ فلاني، برايان ب. (2007). وصفات عددية: فن الحوسبة العلمية . مطبعة جامعة كامبريدج. ص 34. ISBN  978-0-521-88068-8.
  3. ويليام كاهان (1 أكتوبر 1997). "ملاحظات المحاضرة حول حالة معيار IEEE 754 للحساب الثنائي ذي الفاصلة العائمة" (PDF) .
  4. ديفيد إتش سي تشين (21 فبراير 2017). "إزالة/تخفيض أهمية عمليات MinNum وMaxNum من معيار IEEE 754-2018" (ملف PDF) . تم الاطلاع عليه بتاريخ 6 مايو 2019 .
  5. "754R محضر الاجتماع" . 19 مايو 2017. تم الاطلاع عليه بتاريخ 25 يونيو 2017 .
  6. IEEE 754 2019 ، §5.11
  7. معيار الحساب الموجب (2022)
  8. ديفيد غولدبيرغ (1991). "ما يجب أن يعرفه كل عالم حاسوب عن الفاصلة العائمة" .
  9. "دليل مطوري البرامج لهندسة Intel 64 و IA-32، المجلد 1: الهندسة المعمارية الأساسية" . أبريل 2008. الصفحات 118-125 ، 266-267 ، 334-335 . 
  10. IEEE 754 2019 ، §9.7
  11. "مناقشة أساسية لوظائف الحمولة الجديدة" .
  12. "مراجعة معيار IEEE للحسابات ذات الفاصلة العائمة المقرر إصدارها في عام 2019" (PDF) .
  13. "ردًا على: (الطويل) sNaNs ليس كما ينبغي أن يكون..." IEEE . 15 أكتوبر 2010. تم الاطلاع عليه في 5 نوفمبر 2020 .
  14. IEEE 754 2019 ، §3.4
  15. IEEE 754 2019 ، §6.2.1
  16. IEEE 754 2019 ، §3.5.2
  17. "معمارية MIPS للمبرمجين - المجلد الأول: مقدمة إلى معمارية MIPS64" (ملف PDF) . شركة MIPS Technologies، 20 نوفمبر 2013، صفحة 79. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28 سبتمبر 2017. تم الاطلاع عليه بتاريخ 27 سبتمبر 2017 . 
  18. Embeddev، فايف. ""F" امتداد قياسي للفاصلة العائمة أحادية الدقة، الإصدار 2.2 / دليل مجموعة تعليمات RISC-V، المجلد الأول: RISC-V مستوى المستخدم ISA" . Five EmbedDev .
  19. "معالجة NaN و NaN الافتراضي (دليل مرجعي لهندسة ARM، إصدار ARMv7-A و ARMv7-R)" . وثائق - مطورو ARM .
  20. "ما الدافع وراء توحيد قيمة 'NaN'؟ · المشكلة رقم 1463 · WebAssembly/design" . GitHub . انظر رد دان جومان "sunfishcode"
  21. "مواصفات لغة ECMAScript® 2026 - 6.1.6.1 نوع الرقم" . tc39.es. في بعض التطبيقات، قد يتمكن الكود الخارجي من اكتشاف الفرق بين قيم NaN المختلفة، ولكن هذا السلوك يعتمد على التطبيق؛ بالنسبة لكود ECMAScript، لا يمكن تمييز جميع قيم NaN عن بعضها البعض.
  22. "الفصل 4. الأنواع والقيم والمتغيرات" . docs.oracle.com . في معظم الأحيان، تتعامل منصة Java SE مع قيم NaN من نوع معين كما لو كانت مدمجة في قيمة قياسية واحدة، وبالتالي فإن هذه المواصفات تشير عادةً إلى قيمة NaN عشوائية كما لو كانت قيمة قياسية.
  23. نيستروم، روبرت (28 يوليو 2021). " § 30.3 NaN Boxing". صياغة المترجمين . جينيفر بينينغ. ISBN 978-0-9905829-3-9.
  24. "الأساس المنطقي للمعيار الدولي - لغات البرمجة - C، المراجعة 5.10" (PDF) . أبريل 2003. ص 180. 
  25. "ArithmeticException (Java Platform SE 8)" . docs.oracle.com . 
  26. " " . perldoc.perl.org . تم الاطلاع عليه بتاريخ 12 يونيو 2015 .Math::BigInt
  27. " تحليل الأعداد العشرية (مكتبة GNU C)" . sourceware.org . تم الاطلاع عليه في 1 أكتوبر 2025. إذا تم توفير الأحرف... ، فسيتم استخدامها بطريقة غير محددة لاختيار تمثيل معين لـ NaN (يمكن أن يكون هناك عدة تمثيلات).

المعايير

  • جمعية مهندسي الكهرباء والإلكترونيات (IEEE) للحاسبات (29 أغسطس 2008). معيار IEEE للحسابات ذات الفاصلة العائمة . IEEE. الصفحات 1-70 . doi : 10.1109/IEEESTD.2008.4610935 . ISBN  978-0-7381-5753-5. IEEE Std 754-2008.
  • جمعية مهندسي الكهرباء والإلكترونيات (IEEE) للحاسبات (22 يوليو 2019). معيار IEEE للحسابات ذات الفاصلة العائمة . IEEE. الصفحات 1-84 . doi : 10.1109/IEEESTD.2019.8766229 . ISBN  978-1-5044-5924-2. IEEE Std 754-2019.