Двойная точность: умножение больших чисел - PullRequest
0 голосов
/ 18 марта 2012

У меня есть несколько простых операций (вычитание, умножение) с большими числами (целыми числами). Они настолько велики, что я должен сохранить их в переменной long double. Это хорошо, но в некоторых случаях умножение теряет точность.

Пример:

A = 84478098072866400.00
B = 419247971803584000000.00

A * B = 35417271278873496315650351919301394432.00

Очевидно, что это неправильно. Результат умножения должен заканчиваться последовательностью нулей.

Мне нужно сохранять точность, особенно эту (когда числа заканчиваются нулями), потому что это наиболее распространенный случай.

Мой вопрос, как это сделать, пожалуйста? Есть ли способ заставить long double вести себя лучше? Или есть какой-нибудь вариант, как получить точность сохраненного числа?

Большое спасибо!

EDIT:

Я не могу использовать какую-либо внешнюю библиотеку. Я пытаюсь решить одну проблему из архива соревнований ACM. Это часть этого.

Я бы хорошо потерял точность, но я должен ее обнаружить. Когда числа больше long double, это весьма вероятно (возможно, наверняка), что оно заканчивается длинной последовательностью нулей.

Ответы [ 3 ]

1 голос
/ 18 марта 2012

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

0 голосов
/ 18 марта 2012

Вы знаете, как долго, в битах, наибольшее значение, которое вам нужно обработать?

Я спрашиваю, потому что заметил, что на некоторых платформах gcc поддерживает 128-битные целые числа:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html

так что вам может повезти, если вы сможете найти платформу, которая поддерживает длину 128 бит и обновленный gcc.

0 голосов
/ 18 марта 2012

если вы работаете с большими целыми числами, почему бы не попробовать написать класс bigint вместо использования long double?проверьте это:

пример кода C ++ большого класса int

Как реализовать большой int в C ++

...