سؤال

كنت فقط أستخدم GDB لطباعة قيمة مزدوجة ودهشتي المطبوعة -0

ما هي القيمة المزدوجة -0 التي تعني في ج؟

بالمناسبة عندما راجعت المساواة مع 0 ، عادت صحيحًا: لإجراء المقارنة التي قمت بها فقط بما يلي

في GDB

> print some_double
-0
> print some_double == 0
1
هل كانت مفيدة؟

المحلول

صفر سلبي هو مفهوم مفيد للحوسبة العددية وهو رقم عائم صالح في C.

نصائح أخرى

هذه مشكلة معروفة مع printf. نظرًا لأنك تستخدم رقم نقطة عائم ، فلا يوجد تمثيل واحد ممكن في الثنائي. وفي معظم الأوقات فإن التمثيل الثنائي ليس مثاليًا. لذلك ، يتم تخزين 0 ك 0.00000000000000...0042 في بعض الأحيان و كما -0.000000000000000000000123. عندما يطبع PrintF الثاني ، تحصل على ODD -0.

لا أعرف حقًا كيف تقارن مع 0 ، فقط تذكر إضافة إبسيلون عند القيام بمقارنات نقاط عائمة لضبط الشذوذ. على سبيل المثال: لاختبار ما إذا كان اثنين من العوامات متساوية لا تكتب أبدًا a == b لكن fabs(a-b) < 1e-13 حيث 1E-13 هو epsilon (اختر الأسد الذي يناسبك).

في الواقع ، قراءة كتاب "كتابة رمز رائع ، المجلد 1" في الفصل 4 ، يعطي المؤلف الإجابة بوضوح تام ، بسبب استخدام مكمل 1 لتمثيل العائم الموقّع في معيار IEEE FP. هو يقول:

يستخدم Mantissa شكلًا مكملاً بدلاً من تكملة اثنين. هذا يعني أن القيمة الـ 24 بت من Mantissa هي ببساطة رقم ثنائي غير موقّع ، ويحدد جزء الإشارة ، في الوضع 31 ، ما إذا كانت هذه القيمة إيجابية أم سلبية. الأرقام المكملة لها خاصية غير عادية أن هناك اثنين من التمثيل للصفر (مع مجموعة بت الإشارة أو واضحة). بشكل عام ، هذا مهم فقط للشخص الذي يصمم برنامج أو نظام الأجهزة العائم.

التركيز لي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top