2013-03-21 5 views
-2

Мне нужно вычислить некоторое простое математическое выражение, но когда я делаю это в одной строке, результат всегда будет равен нулю. Но правильный результат, очевидно, не равен нулю. И это интересно, но когда я отделяю части выражения, я получаю правильный ответ. Позже я разделю с этим результатом, поэтому оно не должно быть 0.C++ неправильный результат математического выражения

Выражение как это:

(X-X1)/(X2-X1) 

В этом случае дельта: 0

double delta = (x - x1)/(x2 - x1); 

Но таким образом, delta будет правильным:

double top = x - x1; 
double bottom = x2 - x1; 
double delta = top/bottom; 

Есть ли у вас какие-либо идеи, как это могло случиться?

+11

Я принимаю его x, x1 и x2 являются целыми значениями, а 'x2-x1' больше, чем' x-x1'? –

+5

Возможный дубликат [Я не удосужился изучить C до взлома на ядре Linux] (http://google.com/search?q=integer+division+c) – 2013-03-21 14:49:19

+0

Да, они беззнаковые long int и да, x2 -x1 больше. –

ответ

10

Это типичный случай «целочисленного деления, используемого для создания значения поплавка». Если x, x1 и x2 - все целые числа, то компилятор должен, согласно правилам C и C++, использовать целочисленные вычисления для расчета x-x1 и x2-x1, а затем разделить их различия как целочисленные. Если x2-x1 больше x-x1, тогда результат равен нулю [при условии положительных значений, таких как 7/14. -14/-7, очевидно, 2].

Простое исправление для преобразования типа одного выражения к типу с плавающей точкой:

double delta = static_cast<double>(x - x1)/(x2 - x1); 
+1

И под «целым делением» подразумевается, что ответ усечен, то есть вся часть ответа сохраняется, а остальная часть отбрасывается. Итак, '1/2' дает 0 с остатком 1, который выбрасывается, давая' 1/2 == 0'. – iamnotmaynard

+0

Большое спасибо, я понял проблему. (Я не знал, как правильно описать мою проблему, вот почему я задал вопрос.) –

2

В первом случае целое число/целое, результат по-прежнему целочисленный, а затем преобразовать целое число в double.

Во втором случае, двойной/двойной, то вы получите правильный результат.

1

В первом случае вы выполняете int/int, что приведет к значению int. Таким образом, если знаменатель больше числителя, то результат будет обрезан до 0.

Во втором случае, вы оценка double/double выражения, которое будет оценивать до значения double, следовательно, сохранением дробных и целых частей.

0

Вы должны бросить целочисленное деление удвоить. type casting

Смежные вопросы