Проблема с компиляцией G ++: почему 5/18 возвращает ноль? [closed]

У меня есть интересная проблема в G ++:

когда я использую sin (50 * 3,14 / 180), я получаю что-то около 0,766, однако sin (5/18 * 3,24) дает мне 0,000.

Разве это не одно и то же? Кто-нибудь заметил это раньше?

Заранее спасибо за ответ.

-1
задан 10 May 2014 в 02:32

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 если Вам любопытно.

2
ответ дан 10 May 2014 в 02:32

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

Похожие вопросы: