سؤال

وأنا أعمل في C لتنفيذ الزائفة التعليمات البرمجية التي تقول:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

ووfloatDelay ستكون دائما إيجابية. هناك ميزة لاستخدام وظيفة وإيابا من math.h:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

وأو يمكنني استخدام:

delay=(int)(64*(floatDelay - intDelay) + 0.5))
هل كانت مفيدة؟

المحلول

ويجب عليك دائما استخدام يبس الرياضيات المناسبة عند التعامل مع أرقام النقطة العائمة. قد يكون تعويم فقط تقريب قريبة جدا من القيمة الفعلية، والتي يمكن أن تسبب غرابة.

وعلى سبيل المثال، قد 5F أن يقترب إلى 4.9999999 ... وإذا حاولت يلقي مباشرة إلى int سيتم اقتطاع إلى 4.

لمعرفة السبب في العمق، يجب أن ننظر تصل أرقام النقطة العائمة على ويكيبيديا. ولكن باختصار بدلا من تخزين عدد على شكل سلسلة متتالية من بت مثل عدد صحيح، فإنه يتم تخزينها في جزأين. هناك "جزء" وداعية، حيث القيمة النهائية للتعويم هي جزء * (قاعدة ^ الأس).

نصائح أخرى

وليس هناك أي مزايا أن أعرف، وغيرها من حقيقة أن يلقي لكثافة العمليات قد لا يكون واضحا على الفور إلى مبرمجين آخرين أنه يعمل مثل TRUNC ...

وحين مع وظيفة المستديرة، ونواياكم واضحة.

وإما على ما يرام، شرط كما تقول floatDelay هو إيجابي.

ومن الممكن أن واحد هو هامشي أسرع من الآخر، على الرغم من أنه سيكون من الصعب معرفة أي دون مرجعية، بالنظر إلى أن round() هو الى حد بعيد وربما تنفيذها في مترجم جوهري. انها أكثر احتمالا أن أي اختلاف سرعة غير مهم بشكل كبير، لذلك استخدام أيهما كنت تشعر أكثر وضوحا.

ولقد وجدت " اقتطاع قيمة عشرية في ج ++ " شريطة مفيد مناقشة أرقام النقطة العائمة.

وعلى وجه الخصوص قدمت جريج Hewgill هذا الرابط: ما كل عالم الحاسوب يجب أن تعرفه عن العائمة نقطة الحساب ديفيد غولدبرغ

<اقتباس فقرة>   

وعلى سبيل المثال، قد 5F أن يقترب إلى 4.9999999 ...   وإذا حاولت أن يلقي مباشرة إلى int سيتم اقتطاع إلى 4.

هل هذا صحيح حقا؟

إذا عليك التأكد من إضافة 0.5 قبل اقتطاع لكثافة العمليات،
هو حقا 4.9999 مشكلة.

وأعني: 4.9999 + 0.5 = 5.4999 -> 5

و/ يوهان

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