long long int арифметика - PullRequest
       21

long long int арифметика

0 голосов
/ 03 февраля 2012

У меня есть следующее в C:

long long int a;
long long int b;
long long int c;
long long int d=a*b/c;

Однако я хочу, чтобы 'd' было двойным.Есть ли способ, которым я могу умножить, разделить long long int и получить двойное в качестве ответа с точностью до 3 десятичных дробей?

Спасибо

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

В ролях (как минимум) один из long long int с double

double d = a * (double)b / c;
1 голос
/ 03 февраля 2012

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

0 голосов
/ 03 февраля 2012

Поскольку выражения C, включая подвыражения, обычно оцениваются без учета контекста, в котором они появляются, подвыражение a*b/c будет оцениваться с использованием целочисленной арифметики, что означает усеченное деление.

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

long long int a;
long long int b;
long long int c;
/* Assign values to a, b, and c (!) */
double d = (double)a * b / c;

Обратите внимание, что преобразования только первого операнда достаточно, чтобы умножение и деление выполнялись в типе double.

0 голосов
/ 03 февраля 2012

Скажите double d = double(a) * double(b) / double(c);, чтобы получить результат с плавающей запятой.(На самом деле вам нужен только один элемент, чтобы быть double, чтобы продвигать все, но почему бы не быть явным.) Вы получаете обычную точность с плавающей запятой двойной точности (т.е. вы не получаетевыбрать «уровень точности»).

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

...