Проблема с компиляцией 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 если вам интересно

Другие вопросы по тегам