Проблема с компиляцией G++: почему 5/18 возвращает ноль?
У меня есть интересная проблема в G++:
когда я использую грех (50*3,14/180), я получаю что-то около 0,766, однако грех (5/18*3,24) дает мне 0,000.
Разве это не одно и то же? Кто-нибудь видел это раньше?
Заранее спасибо за ваш ответ.
1 ответ
Это не имеет ничего общего с Ubuntu, но...
Причина в том, что выражение 5/18*3.24
компилируется (в данном случае предварительно рассчитывается, но, увы, результат такой же) как (5/18)*3.24
и интерпретируется слева направо.
Сейчас, (5/18)
является операцией между двумя целыми числами и возвращает целочисленное деление между 5 и 18, что равно 0 (с остатком 5, но вы этого не просили). Когда вы умножаете 0 и 3,14, операция смешивается, поэтому (int)0
повышен до (double)0.0
и результат, ну, 0.0
-- как и ожидалось.
В другом случае 50*3.14/180
, во-первых 50*3.14
вычисляется; (int)50
повышен до (double)50.0
и все хорошо.
Мораль: всегда используйте правильный формат для констант. 5
средства (int)5
, 5.0
средства (double)5.0
, 5L
средства (long int)5
, 09
означает, что вы не знаете C / C++...
PS как примечание, это поведение является одним из больших изменений с python2 на python3. Поиск в сети для from __future__ import division
если вам интересно