Ошибка в fminf и fmaxf на 64-битных процессорах iOS

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Я наткнулся на ошибку с 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