لماذا ينتج كود C هذا رقمًا مزدوجًا بدلاً من التعويم؟

StackOverflow https://stackoverflow.com/questions/38198

  •  09-06-2019
  •  | 
  •  

سؤال

celsius = (5.0/9.0) * (fahr-32.0);

هل هو مجرد خيار تطوير قرره مطورو C أم أن هناك سببًا لذلك؟أعتقد أن التعويم أصغر من المزدوج، لذلك قد يكون ذلك لمنع التجاوزات الناتجة عن عدم معرفة التنسيق العشري الذي يجب استخدامه.فهل هذا هو السبب أم أني أغفل أمرا ما؟

هل كانت مفيدة؟

المحلول

أعتقد أن السبب هو التأكد من إمكانية تضمين أي نتيجة.لذا فإن الاختيار الطبيعي يكون مزدوجًا لأنه أكبر نوع بيانات.

نصائح أخرى

celsius = (5.0/9.0) * (fahr-32.0);

في هذا التعبير، 5.0, 9.0, ، و 32.0 نكون doubleس.هذا هو النوع الافتراضي لثابت الفاصلة العائمة - إذا أردت ذلك floats، فإنك سوف تستخدم F لاحقة:

celsius = (5.0F/9.0F) * (fahr-32.0F);

لاحظ أنه إذا fahr كان double, ، فإن نتيجة هذا التعبير الأخير ستكون ما زال يكون أ double:كما أشار فايبهاف، يتم الترويج للأنواع بطريقة تتجنب احتمال فقدان الدقة.

السبب وراء تحويل التعبير إلى الدقة المزدوجة هو أن القيم الحرفية المحددة هي قيم مزدوجة الدقة بشكل افتراضي.إذا قمت بتحديد القيم الحرفية المستخدمة في المعادلة كأعدادات، فسيُرجع التعبير عددًا عائمًا.خذ بعين الاعتبار الكود التالي (Mac OS X باستخدام gcc 4.01).

#include <stdio.h>
int main() {
  float celsius;
  float fahr = 212;
  printf("sizeof(celsius) ---------------------> %d\n", sizeof(celsius));
  printf("sizeof(fahr) ------------------------> %d\n", sizeof(fahr));
  printf("sizeof(double) ----------------------> %d\n", sizeof(double));
  celsius = (5.0f/9.0f) * (fahr-32.0f);
  printf("sizeof((5.0f/9.0f) * (fahr-32.0f)) --> %d\n", sizeof((5.0f/9.0f) * (fahr-32.0f)));
  printf("sizeof((5.0/9.0) * (fahr-32.0)) -----> %d\n", sizeof((5.0/9.0) * (fahr-32.0)));
  printf("celsius -----------------------------> %f\n", celsius);
}

الإخراج هو:

sizeof(celsius) ---------------------> 4
sizeof(fahr) ------------------------> 4
sizeof(double) ----------------------> 8
sizeof((5.0f/9.0f) * (fahr-32.0f)) --> 4
sizeof((5.0/9.0) * (fahr-32.0)) -----> 8
celsius -----------------------------> 100.000008

يجب أن تتمتع ثوابت النقطة العائمة بأعلى دقة متاحة.يمكن تعيين النتيجة إلى تعويم دون مشاكل لا داعي لها.

مرة أخرى في يوم K&Rv1، تم تشجيعه على استخدام التعويم/المزدوج بالتبادل حيث تم تقييم جميع التعبيرات ذات أنواع الفاصلة العائمة دائمًا باستخدام التمثيل "المزدوج"، وهي مشكلة في الحالات التي تكون فيها الكفاءة ذات أهمية قصوى.ثابت الفاصلة العائمة بدون لاحقة f أو F أو l أو L هو من النوع المزدوج.وإذا كان الحرف f أو F هو اللاحقة، يكون الثابت من النوع float.وإذا ألحق بحرف اللام أو اللام فهو من النوع المزدوج الطويل.

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