Почему моя программа печатает неправильное десятичное число - PullRequest
0 голосов
/ 30 мая 2019

Я дал 8 шестнадцатеричных цифр (как пример):

long a0 = 00
long a1 = 2E
long a2 = E8
long a3 = A0
long a4 = 58
long a5 = 0F
long a6 = 37
long a7 = FF

и я хочу напечатать это в десятичном виде.

Итак, я попробовал:

long long Decimal = (pow(16, 14) * a) + (pow(16, 12) * a1) + (pow(16, 10) * a2) + (pow(16, 8) * a3) + (pow(16, 6) * a4) + (pow(16, 4) * a5) + (pow(16, 2) * a6) + (pow(16, 0) * a7);

но я получаю десятичное число, которое не является правильным десятичным. Что касается примера, десятичное значение равно 13203624298493951, но я получаю 13203624298493952.

Спасибо, ребята, за помощь

1 Ответ

3 голосов
/ 30 мая 2019

pow использует арифметику с плавающей точкой и возвращает результат double, в результате чего остальная арифметика в вашем выражении использует double. Арифметика double с плавающей точкой в ​​вашей реализации C не обладает достаточной точностью для точного представления чисел, с которыми вы работаете.

Вместо использования (pow(16, 14) * a0) используйте (long long) a0 << 4*14. При этом используется целочисленная арифметика, и результаты будут точными до тех пор, пока значения не переполняют тип long long.

Обратите внимание, что если можно установить старший бит a0 (рассматривая его как восьмибитное число), что означает, что конечный результат должен быть отрицательным числом, то (long long) a0 << 4*14 переполнит 64-битное long long тип. Вам нужно будет написать другой код для обработки случаев с отрицательным числом. Если вы хотите, чтобы все результаты были без знака, а не с отрицательным, используйте unsigned long long вместо long long.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...