تقنية

finfo: هل tiny أصغر قيمة موجبة ممثلة؟

قيمة موجبة تحت tiny.
الحد الطبيعي أكبر من قيمة المثال.

حد التمثيل الطبيعي يختلف عن أصغر قيمة موجبة.

اقرأ اسم الحد قبل استعماله

tiny اسم آخر لـsmallest_normal، وليس أصغر قيمة موجبة ممثلة؛ توجد قيم دون الطبيعية بينه وبين الصفر. [1]

نستعمل عبارة «تمثيل طبيعي» لمعنى normal في النوع العائم، لا لمعنى الأعداد الطبيعية الصحيحة. والقيم subnormal نسميها هنا «دون الطبيعية» تمييزًا لهذا التمثيل.

ldexp يعيد x1*2**x2؛ إذا كان المدخلان عددين مفردين فالخرج مفرد أيضًا. [2]

السؤال عن تفسير حد النوع. لا نحسب فرقًا صغيرًا عند عدد كبير، ولا نجمع وسطيتين تتجاوزان مجال نوع أصغر. نثبت float64 ونختار قيمًا موجبة صغيرة ممثلة، ثم نفحص قاعدة مؤلفة قد تمحوها.

قيمة موجبة أصغر من tiny

على NumPy 2.3.5، أعطى ldexp(1.25,-1023) القيمة 1.390671161567001e-308 من float64: موجبة وأصغر من tiny المرصود، 2.2250738585072014e-308.

قاعدة خاطئة ألفناها، «إذا x<tiny فأعد صفرًا»، صفّرت القيمة مع أنها ممثلة بالضبط. المرجع الكسري لها (5/4)*2**(-1023)، لا صفر.

الأعداد مؤلفة بلا قياس أو وحدة. اخترنا المعامل 5/4 والأس -1023، ولم ننقل مثالًا عدديًا من المصادر. رجعت القيمة الأصلية من ldexp بالنوع float64 والشكل ()، ثم استعملنا تحويل float للعرض والمقارنة وبناء النسبة الصحيحة.

import numpy as np info=np.finfo(np.float64) x=float(np.ldexp(1.25,-1023)) threshold=float(info.tiny) wrong=0.0 if x<threshold else x print(x,wrong)

المثال يوضح الخطوات نفسها التي فحصنا قيمها. خرج ldexp الموجب هو 1.390671161567001e-308، وخرج الشرط المؤلف صفر. هذا الشرط ليس سلوكًا نسبناه إلى NumPy أو قاعدة نوصي بها؛ ألفناه لنكشف أثر تفسير الحد تفسيرًا خاطئًا.

قرأنا من كائن finfo أيضًا smallest_normal بالقيمة نفسها التي رجعت من tiny، وsmallest_subnormal معروضًا على هيئة 5e-324. نستعمل الكسور الدقيقة عند المقارنة، فاختصار الكتابة العشرية لا يغير قيمة التمثيل المقصودة.

حد طبيعي ووحدة أدنى

في الصيغة المزدوجة، حقل الكسر 52 بتًا؛ الطبيعي له بت دال أول 1، ودون الطبيعي له بت أول 0. [3]

من صيغ التمثيل المزدوج، أصغر طبيعي موجب 2**(-1022)، وأصغر وحدة موجبة دون الطبيعية 2**(-1022)*2**(-52)=2**(-1074). [3]

قسمة القيمة المؤلفة على الحد الطبيعي تعطي (5/4)*2**(-1023)/2**(-1022)=5/8. تقع لذلك بين الصفر والحد، دون الحاجة إلى معاملتها كصفر.

وفي وحدات 2**(-1074)، تساوي القيمة (5/4)*2**51=5*2**49 وحدة صحيحة. هذه قراءة من مرجعنا الكسري؛ اخترنا قيمة ممثلة بالضبط، فلا نقارن رقمًا مقربًا بقيمة مقصودة لم تدخل التمثيل أصلًا.

لا نستنتج من ذلك أن كل كسر صغير ممثل، أو أن الدقة النسبية لا تتغير قرب الصفر. فحصنا المساواة الدقيقة لهذه القيم، ولم نقس فقد الدقة أو إعدادات التقريب أو أداء الحساب أو بيئة الفاصلة العائمة العامة.

قاعدة مؤلفة وليست سلوك NumPy.
صفّرت القاعدة المثال وأبقت التحكم.

التحكم والشبكة وحدود العد

تحكم مستقل ldexp(1.25,-1022) أعطى 2.7813423231340017e-308، فلم تصفره قاعدتنا. بقاء هذا التحكم لا يصحح تفسير tiny.

اجتازت 20 حالة مساواة كسرية دقيقة: 21 نداءً مباشرًا مسمى، منها finfo واحد و20 ldexp. صفّرت القاعدة المؤلفة 11 قيمة موجبة دون الطبيعية، وأبقت 9 قيم طبيعية التمثيل؛ الأعداد تخص هذه الحالات.

التحكم أكبر من tiny بمقدار نسبي 5/4. لذلك أبقاه الشرط المؤلف، بينما كانت نسبة المثال الرئيسي 5/8. يمر اختبار التحكم في النطاق الطبيعي ولا يكشف وحده محو القيم الموجبة دون الطبيعية.

للشبكة معاملات صحيحة من {1,2,3} وستة أسس {-1074,-1060,-1040,-1023,-1022,-1021}: عددها 3*6=18. أضفنا المثال والتحكم بمعاملهما 5/4 خارج الشبكة، فصار العدد 20.

بنى المرجع Fraction من المعامل والأس: m/2**(-e). وحول كل قيمة مرصودة إلى نسبة عددين صحيحين، ثم قارن النسبتين تمامًا. لم يستعمل ldexp أو finfo لتوليد القيمة المتوقعة؛ الحدود المرجعية ثابتة لصيغة binary64 المعلنة.

عدّ النداءات المباشرة المسماة يشمل استدعاء finfo مرة واحدة يرجع كائن معلومات، و20 استدعاء ldexp. أما عدّ العناصر العددية فيشمل 20 خرجًا مفردًا من ldexp فقط. كائن المعلومات الواحد، ومشاهدات خصائصه الثلاث، و20 ناتجًا مشتقًا لشرطنا، مسجلة منفصلة عن ذلك العدد.

لا يشمل هذا العد النداءات الداخلية للمكتبة، أو تحويل float والعرض والمقارنات والحساب الكسري في بايثون. لم ننشئ مصفوفات، ولم نفحص تغير بايتات المدخلات أو ملكية ذاكرة أو مشاركة مخازن.

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

المثالالقيمة الموجبةالشرط المؤلف
1.25*2**(-1023)1.390671161567001e-3080.0
1.25*2**(-1022)2.7813423231340017e-3082.7813423231340017e-308

للتوسع: حدود تمثيل float32.

المراجع

  1. NumPy finfo
  2. NumPy ldexp
  3. Oracle IEEE double format

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.