2017-02-06 22 views
1

мне было интересно, если там может быть аа небольшого различия (для проблем производительности) между умножением и делением в простых вычислениях, как в:В простой операции с плавающей точкой есть ли разница между умножением и делением?

float thing = Mouse.getDY() * 0.1f; 
float otherThing = Mouse.getDY()/10f; 

когда такой рода вещи происходит много, конечно, например, в расчет положения камеры в 3D-игре (lwjgl).

Спасибо!

+1

Да, есть разница. Но вам нужно будет предоставить больше контекста, если вы не захотите, чтобы люди, звонящие вам, были вынуждены отказаться от преждевременной оптимизации. – Mysticial

+0

Немного, но мне было интересно, особенно в вычислении 3D-игр, в Java – Damoy

ответ

0

Да, вы получаете разные результаты, так как 10f можно точно представить, но 0.1f не может.

System.out.println(0.1f * 0.1f); 
System.out.println(0.1f/10f); 

печатает

0.010000001 
0.01 

Примечание: использование double имеет гораздо меньшую ошибку, но она не уходит без округления.

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

+0

OP, похоже, спрашивает о производительности, поэтому я думаю, что вам нужно что-то сказать об этом. (Обратите внимание, что существует много ситуаций, когда бит дополнительного округления в порядке, если разница в производительности достаточно велика ... хотя в этом случае OP, очевидно, потребуется измерять и то и другое.) – ruakh

+0

О, я вижу, забыл об этом, спасибо ! Таким образом, невозможно, чтобы разделение могло быть более «редуктором производительности», чем умножением в подобных примерах? – Damoy

+0

@ Умножение Damoy может быть более быстрым, но вам нужно сделать много * из них, чтобы действительно иметь значение, т. Е. Десятки тысяч, прежде чем он даже измерил разницу и сотни миллионов, прежде чем вы сможете это увидеть. –

0

Будет не только разница в производительности. Mouse.getDY() возвращает значение int, поэтому результаты будут разными.

В первом случае у вас будет результат поплавка с дробной частью, во втором случае он будет преобразован в float.

I.e. 54 * 0.1f == 5.4f, но 54/10 == 5

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

+0

Поскольку вопрос задает вопрос о 'Mouse.getDY()/10f', комментарий о целочисленном делении больше не применяется. '54 * 0,1f', вероятно, точно не соответствует« 5.4f », но я не проверял, чтобы быть уверенным. Разница в производительности между умножением и разделением вряд ли имеет значение. –

+0

Это был «Mouse.getDY()/10' в оригинале вопрос. –