Будет ли сравнение двух чисел с плавающей точкой потреблять больше процессорного времени, чем два целых?Будет ли сравнение двух чисел с плавающей точкой потреблять больше процессорного времени, чем два целых?
ответ
С сегодняшними процессорами (за исключением, возможно, встроенных машин и Atom) вы не можете делать прогнозы о том, насколько быстро может быть одна инкременция в коде.
Прежде всего, он может быть удален компилятором, если он, как известно, не имеет значения, он может быть переписан компилятором во что-то другое, которое известно быстрее и т. Д. Это одна ошибка.
Во-вторых, процессоры могут выполнять более одной команды за один цикл, или сделать их асинхронно и делать другие вещи во время ожидания FPU и т.д.
В вашем конкретном случае, сравнивая два числа должны быть мгновенным, я. е. в одном цикле. Но вы, вероятно, не можете использовать этот результат в том же самом цикле. Но это должно быть справедливо как для целых чисел, так и для чисел с плавающей запятой.
Помните, что это всего лишь серия бит, и хотя числа с плавающей запятой могут быть немного разными из-за их структуры, это по-прежнему довольно простая проблема (сравнить знак, сравнить экспоненту, сравнить мантисса).
IIRC, стандарт IEEE 754 числа с плавающей точкой сохраняются таким образом, что, если рассматривать их как целые числа, они сравнивают одинаково:
| знак | экспоненты | Значение |
Значимость (слово, которое я совершенно забыл перед тем, как обратиться к статье в Википедии) - это первые несколько значащих цифр номера.
Если два числа с плавающей точкой a < b
, то у вас есть один из:
a
отрицательных,b
не отрицательных;- оба одинаковых знака, но
a
's exponent <b
' s exponent; или - оба одинаковых знака и экспонента, но
a
<b
.
Таким образом, вы можете просто взять 32 бита каждого числа в виде целых чисел и сравнить их с помощью обычной целочисленной арифметики. Я не знаю, действительно ли это то, что делают компиляторы на практике. Существует несколько специальных представлений для определенных чисел, и эти краевые случаи могут означать, что процессор FP должен делать это по-другому.
См http://en.wikipedia.org/wiki/Floating_point#Internal_representation
спасибо, edmund. – lovespring
Вы можете сравнивать числа с плавающей запятой как целые числа, если один или оба положительные; если оба они отрицательные, сравнение не будет работать должным образом. –
обработка с плавающей точкой, даже если рассматривать в качестве целое будет принимать больше, потому что поплавок больше, на PHP я тестировал один раз только разделяющий 1 для 3 до 32.000.000 десятичных цифр и я занял около 0,33 секунды, деление 1 на 3-10 десятичных цифр заняло 0.0002 или что-то в этом роде (эти значения могут немного отличаться, но в зависимости от размера поплавка это может сильно занять вас и работать с такими большими поплавками займет много времени, если вы хотите быть более конкретный и испытать эту тему, было бы идеально, потому что часть времени, которую я ждала, могла быть из-за скорости памяти или чего-то подобного, а не процессора)
в любом случае, учитывая, что вы не будете достаточно сумасшедшим, чтобы работать с поплавками с более 50 знаков после запятой вам должно быть хорошо
Я не знаю, что ты плачешь, но вот и 32 бит. PHP действительно не является хорошей мерой, когда мы думаем о низкой производительности. –
@ Michael Nett я знаю, но, может быть, вы можете сделать один и тот же тест на языке низкого уровня, я думаю, что ваш результат будет почти таким же, потому что перемещение больших чисел, даже если float интерпретируются как целые числа, также будет занимать больше времени и делать с ними операции слишком. кроме того, что все языки высокого уровня должны быть скомпилированы до низкого уровня, чтобы работать, если разница, которую я заметил, не была большой, зная, что существуют огромные различия между языками низкого уровня и высокого уровня, это было бы понятно, но разница была чудовищной , мой компьютер x64, и я использую xampp (x86) с win7 x64 ultimate – wxiiir
Вообще-то нет. Они хранятся в пути, где сравнение простое. Кроме того, многие процессоры имеют аппаратную оптимизацию для чисел с плавающей запятой. Можете ли вы предоставить более подробную информацию? Если вы не работаете в режиме реального времени, это не должно вызывать беспокойства. – Kobi