خطأ في fminf وfmaxf على معالجات iOS 64 بت
سؤال
لقد صادفت خطأً في معالجات 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
.