Сравнение поплавковых и двойных типов данных в объекте C
При использовании двойного или плавающего типа данных в приложении iPhone у меня возникают проблемы с сравнениями «> =» и « = 4.2», является ложным вместо истинного. Как я могу избежать этой проблемы?
- Когда следует использовать ключевое слово "strictfp" в java?
- Как эффективно выполнять преобразования double / int64 с помощью SSE / AVX?
- Как хранится плавающая запятая? Когда это имеет значение?
- Float и двойной тип данных в Java
- Что случилось с этим делением?
- Как может примитивное значение float быть -0.0? Что это значит?
- C ++ десятичные типы данных
- Усечение Десятичное число не округлено
когда переменной присваивается номер, введенный с одним десятичным знаком, например 4.2, поплавок или двойник, используемые в сравнении, фактически могут иметь значение, такое как 4.1999998092651367
Не может . будет . Конкретно:
float f = 4.2; // f is exactly 4.19999980926513671875 double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125
Проблема возникает, когда вы пишете что-то вроде:
float f = 4.2; if (f >= 4.2) { // this block of code is not executed. }
f
– это точно 4.19999980926513671875
, но вы сравниваете его с литералом двойной точности «4.2», который имеет значение 4.20000000000000017763568394002504646778106689453125
, поэтому сравнение не удается. Если вместо этого вы сравниваете единый прецизионный литерал «4.2f»:
float f = 4.2; if (f >= 4.2f) { // this block of code is exectued. }
сравнение выполняется успешно, так как значения в точности равны. Плавающая точка сложна, но она полностью детерминирована; одна из простейших вещей, которую вы можете сделать, чтобы сделать ее более интуитивной, – это не смешивать оценки. Если вы работаете с float
, убедитесь, что все ваши литералы имеют суффикс f
чтобы сделать их одинарной точностью.
(Это также может повысить производительность, но это не причина для этого, причина в том, что это сделает ваш код более правильным).