2013-11-03 1 views
2
unsigned long long a,b,c; 
cin>>a>>b>>c; 
cout<<(a*b*c); 

Ввод заданного: 512 294967268 279632277 выхода: 5337484673731225600Умножение 3 длинных длинных чисел дает разные ответы на C++ и Python

Однако, когда я 512 * 294967268 * 279632277 в Python, выход я получаю:

42230972821150328832L 

Почему у меня есть другой ответ?

+0

Переполнение очевидно. Вместо этого используйте 'long double'. Проверьте «sizeof (long long)» и «long double», и вы увидите разницу. –

ответ

5

Переполнение на C++ наверняка.

У Python есть тип данных произвольного размера для сохранения результата. Поэтому, если значение, которое нужно сохранить, велико, размер размера этого типа также является большим автоматически.

>> x = 512 * 294967268 * 279632277 
>> x 
42230972821150328832L 
>> type(x) 
<type 'long'> 
>> x.__sizeof__() 
36 
>> x = x * x 
>> x 
1783455065420737763677831948901730484224L 
>> type(x) 
<type 'long'> 
>> x.__sizeof__() 
44 

Так что практически нет ограничений на размер данных. Доступная память определяет теоретический предел.

+0

Обычно случается, что при необходимости целые числа присваиваются произвольному типу точности. Подробнее об этом [здесь] (http://stackoverflow.com/questions/4581842/python-integer-ranges). – juanchopanza

+0

Использование библиотеки многоточечной арифметики GNU http://gmplib.org/ – Damian

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