علوم وفضاء

signbit: هل تعني أن العدد أقل من صفر؟

ثلاث نتائج لكل قيمة.
رسم أصلي لتشغيل موثق.

signbit تفحص بت الإشارة عنصرًا بعنصر. [1] نقارنها باختبارين عدديين في متجه مؤلف يضم صفرين ذوي إشارة.

افصل البت والمقارنة

تصف الوثائق signbit باختبار بت الإشارة، والناتج منطقي. [1]

نكتب في ورقة المراجعة ثلاثة أسئلة مستقلة: هل بت الإشارة مضبوط؟ هل القيمة أقل من صفر؟ هل القيمة تساوي صفرًا؟ لا نختصرها كلها في عبارة «عدد سالب» قبل تحديد ما نريد فحصه.

كل الأعداد هنا أمثلة مؤلفة شغّلناها محليًا. سنعرض القيمتين الصفريتين كما أدخلناهما ونحفظ ترتيب عناصر المتجه، حتى نرى موضع الاختلاف دون افتراض سبب نشوء أي صفر في حساب سابق.

قارن ثلاثة اختبارات

أنشأنا x=np.array([-3.5,-0.0,0.0,4.25],dtype=np.float64) في NumPy 2.3.5 على CPython 3.12.14. كتبنا +0.0 في العرض لتوضيح أن الموضع الثالث يحمل الصفر ذا الإشارة الموجبة في التشغيل.

الاستدعاء np.signbit(x) أعطى [True,True,False,False]. المقارنة x<0 أعطت [True,False,False,False]. عند العدد −3.5 اتفق الاختباران، لكن عند −0.0 كان الأول True والثاني False.

إذن القناع الأول يختار موضعين في متجهنا، والثاني يختار موضعًا واحدًا. إذا كان شرط ورقة المثال هو «قيم أقل من صفر»، فإن تبديل القناعين يضيف الموضع الثاني إلى الاختيار رغم أنه لم يحقق ذلك الشرط.

أما x==0 فأعطى [False,True,True,False]. كما أعطت مقارنة x[1]==x[2] النتيجة True. لم نخلق قيمتين مختلفتين على خط الأعداد؛ نراقب اختلاف تمثيل الإشارة إلى جانب مساواة القيمة في هذه التجربة.

راجع البتات والقيمة المطلقة

راجعنا الإشارة بمرجع مستقل عن np.signbit: عبأنا كل قيمة باستخدام struct.pack('>d',float(value))، ثم قرأنا البايتات عددًا صحيحًا من جهة big-endian. هذه تعبئة مرجعية معلنة، وليست ادعاءً عن ترتيب بايتات ملف أو ذاكرة الجهاز الأصلي.

لـ −0.0 كانت الكتابة السداسية 8000000000000000، ولـ +0.0 كانت 0000000000000000. سجل التعبئة ثمانية بايتات، أي 64 بتًا؛ الإشارة في قراءتنا تقابل البت الأعلى الذي اختبرناه بالإزاحة 63 موضعًا.

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

شغّلنا أيضًا np.signbit(np.abs(x))، فأعطى [False,False,False,False]. قيمة الموضع الثاني بقيت صفرًا في هذا المسار، لكن نتيجة اختبار الإشارة أصبحت False. القناع بعد العملية لا يخبرنا وحده أي الموضعين الصفريين كان يحمل الإشارة السالبة في الأصل.

لم نختبر عمليات قسمة أو دوال تولد أصفارًا، ولم ننقل الإشارة بعملية copysign. الهدف مقارنة اختبارات محددة لمدخلات ظاهرة، لا شرح جميع الآثار الممكنة للصفر ذي الإشارة.

بتان مختلفان وصفران متساويان.
رسم أصلي لتشغيل موثق.

حدد نطاق الفحوص

أنشأنا 129 قيمة محدودة من k/4، للأعداد الصحيحة k من −64 إلى 64 شاملًا؛ المجال من −16 إلى 16. أضفنا −0.0 صراحة، فصار لدينا 130 حالة، لأن الصفر في شبكة القيم جاء بإشارة موجبة.

لكل حالة خمسة فحوص: اتفاق signbit مع البت الأعلى في التعبئة المستقلة؛ اتفاق المقارنة بالصفر مع المقارنة العددية المرجعية؛ اتفاق مساواة الصفر؛ فحص القيمة والبت بعد np.abs؛ وبقاء بايتات المدخل الأصلي بعد الاستدعاءات.

حسابنا 130×5=650، ثم أضفنا ستة تحكمات للمتجه المعروض والأقنعة الثلاثة ونمطي الصفر ونتائج np.abs ومساواة الصفرين؛ صار الإجمالي 656، ومرت الفحوص كلها.

النطاق float64 محدود، وحالات مفردة ومتجه واحد. لم نفحص NaN أو اللانهاية أو الأعداد المركبة والصحيحة أو where/out أو الأداء أو مشاركة الذاكرة أو فقدان الإشارة عند التخزين. نتائجنا لا تثبت ملاءمة أي قناع لمهمة لم تعلن شرطها.

القيمةsignbitأقل من صفريساوي صفرًا
−3.5TrueTrueFalse
−0.0TrueFalseTrue
+0.0FalseFalseTrue
4.25FalseFalseFalse

للتوسع: مقارنة الأعداد.

المراجع

  1. NumPy 2.3 — signbit

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