سؤال
كنت فقط أستخدم 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 ، ما إذا كانت هذه القيمة إيجابية أم سلبية. الأرقام المكملة لها خاصية غير عادية أن هناك اثنين من التمثيل للصفر (مع مجموعة بت الإشارة أو واضحة). بشكل عام ، هذا مهم فقط للشخص الذي يصمم برنامج أو نظام الأجهزة العائم.
التركيز لي