Точно посчитать вероятность

biblioteka

Дана формула для вероятности:
p=, т.е. если не смотреть на индексы у f, то p=1-sqrt(1-exp(2f где f может находится в диапазоне от 0 до минус бесконечности.
Понятно, что при большом отрицательном f, машина всегда будет давать p=0, но на самом деле она не будет равна 0-ю.
Вообще мне нужно найти логарифм ln(p т.к. p может быть меньше машинного предела:
eps(0)=4.94065645841247e-324;

Damrad

используй какую-нибудь библиотеку длинной арифметики

Sensor4ik

Как распределена f на (-inf,0]?

biblioteka

Как распределена f на (-inf,0]?


Не знаю, что это тебе даст.

biblioteka

Не знаю, что это тебе даст.
Для конкретно этого случая:

mtk79

при таких хардкорных величинах, p можно, например, разложить p=1/2*exp(-2|f| тогда логарифм будет порядка -|f|. Как я понимаю, пределом будет |f|<1/eps(0 и нужно оценить логарифм в диапазоне ln(eps(0<|f|<1/eps(0). Сама оценка тоже нужна "точной" (т.е. с точными 324 знаками)?
Честно говоря, не понимаю, зачем нужны такие числа на практике, кроме как набить руку в умениях это делать на машине.

biblioteka

(т.е. с точными 324 знаками)?
нет, это не столько знаков.
Точность обычная двойная eps(1)=2.22044604925031e-16
realmax
ans =
1.79769313486232e+308
>> realmin
ans =
2.2250738585072e-308
Это числа выше которых и ниже которых машина уже не может число представлять
10^1000
ans =
Inf
10^-1000
ans =
0

biblioteka

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

abramenkomv

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

abramenkomv

Или так: (что-то не получилось набрать в теге "math")
 
 $$p=1-\sqrt{1-exp(2f)} = \frac{(1-\sqrt{...}1+\sqrt{...})}{1+\sqrt{...}} = \frac{exp(2f)}{1+\sqrt{1-exp(2f)}}$  

 
 $$\ln{p}=2f-ln{1+\sqrt{1-exp(2f)}}$$ 

А для вычисления ln(1+x) есть даже специальная функция в стандартной С-ной библиотеке math.h: log1p. Ну либо для повышения точности уже этот логарифм расскладывать в ряд Тейлора.

Romyk


используй какую-нибудь библиотеку длинной арифметики

Чем этот вариант не устраивает? Судя по википедии даже банальный bc это умеет, не говоря про maxima sage и сотоварищи.
http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic

biblioteka

Ага, решение превосходное.
При помощи него и log1p я до машинной точности получаю результат при любом f:

Примеры:
fidelity=-0.5
lnpValue=log(1-sqrt(1-exp(2*fidelity
lnpValue =
     -1.58503850194839
lnpValue2=2*fidelity-log1p(sqrt(1-exp(2*fidelity
lnpValue2 =
     -1.58503850194839
fidelity=-0.00000001;
>> lnpValue=log(1-sqrt(1-exp(2*fidelity
lnpValue =
     -0.000141431356357854
>> lnpValue2=2*fidelity-log1p(sqrt(1-exp(2*fidelity
lnpValue2 =
     -0.00014143135635787
>>

Sensor4ik

Да, извини, после прочтения заголовка не сразу врубился, что задача не из теорвера, а из вычислительных методов.
Оставить комментарий
Имя или ник:
Комментарий: