взятие соотношений журналов в numpy/scipy в Python

Я пытаюсь рассчитать соотношение двух значений журнала a и b, а затем преобразовать его обратно в нелогарифмические значения. Поскольку это логарифмические значения, отношение c равно:

from numpy import *
c = a - b
# convert to non-log value
val = exp(c)

рассмотрим этот пример:

a = -336929.42757
b = -334216.16795

поскольку это логарифмические значения, соотношение равно:

c = -2713.259620000026

Затем я конвертирую соотношение в нелогарифмические значения и получаю 0:

val = exp(c)

Как я могу этого избежать? Каков правильный способ взять соотношение двух журналов и преобразовать обратно в нелогарифмический без такого поведения?


person Community    schedule 15.04.2013    source источник
comment
как вы вычисляете значения, которые вы присваиваете a и b?   -  person shx2    schedule 16.04.2013
comment
Я выполняю всю арифметику в значениях журнала, поэтому a и b являются просто результатом арифметики значений журнала. Я просто беру log(...) вещей и складываю/вычитаю их, чтобы получить два значения, соотношение которых я хочу сравнить.   -  person    schedule 16.04.2013
comment
Окончательный ответ: ~4.429e-1179, что слишком мало для хранения в объекте с плавающей запятой. Это действительно тот номер, который вам нужен?   -  person DSM    schedule 16.04.2013
comment
@DSM: нет, меня просто волнует соотношение, и я хочу посмотреть, больше ли оно определенного порогового значения.   -  person    schedule 16.04.2013
comment
@ user248237dfsf, вы можете преобразовать значение отсечения в журнал и в любом случае сравнить его с другими журналами.   -  person thkang    schedule 16.04.2013
comment
Дай мне попробовать снова. val == exp(c) == 4.4291364817936896e-1179. Вы можете использовать экземпляр Decimal, или объект mpf, или что-то еще, чтобы сохранить его, если вам это действительно нужно, но ваше соотношение не будет соответствовать тому, что есть в float.   -  person DSM    schedule 16.04.2013


Ответы (2)


Проблема явно в том, что exp(-2713.259620000026) не очень хорошо представлено числом с плавающей запятой. Но поскольку вы знаете журнал числа, вы можете сделать что-то вроде:

c10 = c/log(10.)

so

x = 10**c10

или, но разделяя целую и дробную части:

x = 4.29 x 10^(-1179)
person tom10    schedule 15.04.2013

Что ж, число, которое вы ожидаете, слишком мало для представления с помощью float. Например, в моей системе:

In : sys.float_info.min_exp
Out: -1021

Таким образом, вы получаете 0,0

Если вы хотите сравнить его только с некоторым значением отсечки, вы все равно можете использовать полученный 0. «Настоящее» непредставимое число в вашем случае равно 0.

person shx2    schedule 15.04.2013