C / C ++: скорость сравнения с плавающей точкой - PullRequest
4 голосов
/ 15 января 2011

Я проверяю, чтобы убедиться, что число с плавающей точкой не равно нулю. Поплавок не может стать отрицательным. Так быстрее это сделать float != 0.0f или float > 0.0f?

Спасибо.

Редактировать: Да, я знаю, что это микрооптимизация. Но это будет вызываться каждый раз через мой игровой цикл, и я все равно хотел бы знать.

Ответы [ 5 ]

8 голосов
/ 15 января 2011

Вероятность различий в производительности вряд ли будет.

5 голосов
/ 15 января 2011

Рассмотрим только для развлекательных целей:

Только 2 значения с плавающей запятой сравниваются равными 0f: ноль и отрицательный ноль, и они отличаются только на 1 бит.Так что эмуляция схем / программного обеспечения, которая проверяет, ясны ли 31 незнаковые биты, сделает это.

Сравнение >0f немного сложнее, так как отрицательные числа и 0 приводят к ложным, положительные числа приводят к истине, но значения NaN (обоих знаков) также приводят к значению false, поэтому это немного больше, чем просто проверка знака знака.

В зависимости от режима с плавающей запятой любая операция может привести к сверхточному результату с плавающей запятойперед сравнением зарегистрируйте округление до 32 бит, так что счет даже там.

Если бы разница была вообще, я бы ожидал, что != будет быстрее, но я бы не ожидалразница должна быть, и я не удивлюсь, что ошибаюсь в какой-то конкретной реализации.

Я предполагаю, что ваше доказательство того, что значение не может быть отрицательным, не подвержено ошибкам с плавающей запятой.Например, вычисления по линиям 1/2.0 - 1/3.0 - 1/6.0 или 0.4 - 0.2 - 0.2 могут привести к положительным или отрицательным значениям, если ошибки накапливаются, а не отменяются, поэтому, вероятно, ничего подобного не происходит.Единственным реальным использованием теста с плавающей точкой на равенство с 0 является проверка того, назначен ли вам литерал 0.Или результат какого-либо другого вычисления гарантированно приведет к результату 0 в float, но это может быть хитрым.

3 голосов
/ 15 января 2011

Невозможно дать четкий ответ, не зная вашей платформы и компилятора. Стандарт C не определяет, как реализованы числа с плавающей точкой.

На некоторых платформах да, на других платформах нет.

Если сомневаетесь, измерьте.

2 голосов
/ 15 января 2011

Насколько я знаю, f != 0.0f иногда возвращает true, когда вы думаете, что оно должно быть ложным.

Чтобы проверить, не является ли число с плавающей точкой ненулевым, вы должны сделать Math.abs(f) > EPSILON, где EPSILON - это ошибка, которую вы можете допустить.

Производительность не должна быть большой проблемой в этом сравнении.

0 голосов
/ 15 января 2011

Это почти наверняка тот вид микрооптимизации, который вы не должны делать, пока у вас нет количественных данных, показывающих, что это проблема. Если вы можете доказать, что это проблема, вы должны выяснить, как заставить ваш компилятор отображать инструкции компьютера, которые он генерирует, затем взять эту информацию и перейти к книге данных для процессора, который вы используете, и посмотреть количество требуемых тактов для альтернативных реализаций той же логики. Затем вам следует провести повторные измерения, чтобы убедиться, что вы видите выгоды, если таковые имеются.

Если у вас нет данных, показывающих, что это проблема производительности, придерживайтесь реализации, которая наиболее четко и просто представляет логику того, что вы пытаетесь сделать.

...