Ошибка в fminf и fmaxf на 64-битных процессорах iOS
Вопрос
Я наткнулся на ошибку с 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
.