سؤال

لقد صادفت خطأً في معالجات 64 بت التي أردت مشاركتها.

CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;

value = fmaxf( test1, test2 );

ستكون النتيجة:
القيمة = 0.5799999833106995

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

if( test1 == value ){
 // do something
}

ومع ذلك، إذا كنت تستخدم MIN( A, B ) أو MAX( A, B ) فسوف يعمل كما هو متوقع.
اعتقدت أن هذا كان يستحق المشاركة

شكرًا

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

المحلول

وهذا لا علاقة له بالخلل الموجود fminf أو fmaxf.هناك خطأ في التعليمات البرمجية الخاصة بك.

على أنظمة 64 بت، CGFloat تم الكتابة عليه double, ، لكنك تستخدم fmaxf الوظيفة التي تعمل عليها float (لا double)، مما يؤدي إلى تقريب وسيطاتها إلى دقة واحدة، وبالتالي تغيير القيمة.لا تفعل ذلك.

في أنظمة 32 بت، لا يحدث هذا بسبب CGFloat تم الكتابة عليه float, ، مطابقة الوسيطة ونوع الإرجاع fmaxf;لا يحدث أي تقريب.

بدلا من ذلك، إما أن تشمل <tgmath.h> والاستخدام fmax بدون ال f لاحقة، أو استخدام float بدلاً من CGFloat.

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