2012-06-20 3 views
1

У меня есть функция, которая возвращает log10 значений. При преобразовании их в нормальные числа я получаю ошибку переполнения.Сила десятичного числа, производящего OverflowError

OverflowError: (34, 'Numerical result out of range')

Я проверил значение журналов и эта ошибка возникает для скажу, +508,038057662.

Я считаю, что в то время как python легко выполняет 10 ** 509, эта ошибка должна быть вызвана переполнением регистра. Поэтому я попытался использовать numpy.float64, например,

result = np.array([ (10**multiplicity(timeseries,om,ph,bins,pos_arr)) for ph in np.linspace(0,twopi,num = bins+1)], dtype = np.float64) 

Ошибка такая же. Я объявляю float64 неправильным?

Здесь множественность() - это функция, которая возвращает log10 значения. Мне нужен «список» значений.

+0

Хорошо .... 10^509 is> 2^64 ... или я пропущу что-то очевидное здесь? –

+0

'10 ** 509 = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L' с помощью Python – Mellkor

+0

Да, но ответ-эр ниже говорит, что это типа 'long', а не типа' float64'. Вы заметите, что, возможно, неудивительно, что этот тип данных может содержать только до 64 бит. –

ответ

7

I reckon that while python easily performs 10**509, this error must be due to the decimal points overflowing the register.

Проблема заключается не в «перепадении десятичных знаков», а в результате использования типа данных, который вы используете.

Python может счастливо вычислить 10 ** 509 как long так these have unlimited precision:

>>> type(10**509) 
<type 'long'> 

Однако этот результат слишком велик, чтобы хранить в float:

>>> float(10**509) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: long int too large to convert to float 

Мы можем проверить, максимум float довольно легко:

>>> import sys 
>>> sys.float_info.max 
1.7976931348623157e+308 

Глядя на this question, кажется, что Numpy float64 имеет тот же диапазон значений, что и стандарт float, поэтому использование этого не поможет исправить вашу проблему.

Вместо этого вам придется использовать один из сторонних модулей, которые обеспечивают произвольные точки с плавающей запятой, такие как mpmath или bigfloat.

+0

Хорошо. Так есть способ конвертировать мой float в long then ?? Или я должен использовать bigfloat или mpmath ?? Ой долго не учитывает обряд десятичных знаков? – Mellkor

+0

'long' для целых чисел.Так что '10 ** 508' будет нормально, но' 10 ** 508.5' не будет. Поэтому я думаю, что вы застряли с bigfloat или mpmath, если вам действительно нужно работать с плавающими точками, большими. –

+0

GMPy - это то, на что вы должны смотреть, если вы идете на третью сторону. –

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