2017-01-28 14 views
1

Я пытаюсь построить логарифмическую функцию: x*log(1+1/x) для очень больших значений x. Я проверил несколько терминов, так как общий сюжет не был хорошим, и проблема в том, что, хотя эта функция никогда не должна быть выше 1, в некоторых случаях она становится больше, чем 1. Я считаю, что она имеет какое-то отношение к точности log.Точность в логарифмической функции с Python

для следующих значений х:

[ 5.4380181e+11 3.1688845e+12 4.5195668e+13 7.4634268e+14 1.2442192e+16 
    2.0754228e+17 3.4624427e+18 5.787843e+19 9.9925409e+20 2.6069079e+22] 

я получаю за x*np.log(1+1/x):

[ 0.99999999 0.99999989 0.99999774 0.9999925 0.99959801 0.99007829 
    1.1261964 0.0 0.0 0.0] 

Как вы можете видеть, что седьмой член больше, чем 1.

Я попытался с помощью log1p, но это дает нечувствительные ответы.

Я также попытался использовать np.float128(), но получаю точно такие же результаты, как указано выше.

Любые идеи?

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

+3

Что вы пробовали с 'log1p'? Он должен иметь возможность дать правильный результат. – kennytm

ответ

2

Прочтите страницу руководства для log1p. Он не принимает тот же аргумент, что и log. Думаю, это объясняет «нечувствительные ответы».

Это работает для меня:

l = [5.4380181e+11, 3.1688845e+12, 4.5195668e+13, 7.4634268e+14, 1.2442192e+16, 2.0754228e+17, 3.4624427e+18, 5.787843e+19, 9.9925409e+20, 2.6069079e+22] 

[n*log1p(1/n) for n in l] 

Выход:

[+0,9999999999990805,
+0,9999999999998422,
+0,9999999999999888,
+0,9999999999999992,
1,0,
1,0,
1,0 ,
1,0,
1,0,
1,0]

+0

Привет, спасибо большое! Да, похоже, сейчас это работает, я так глуп. Тем не менее, я получаю все 1.0, даже используя np.float128. Ты знаешь почему? –

+0

@ Андрес Рад помочь. Не нужно чувствовать себя глупо; все программисты время от времени совершают подобные ошибки. Numpy по умолчанию имеет 8 цифр точности для вывода с плавающей запятой, поэтому то, что вы видите, не то, что на самом деле там :) Числа округлены до 1.0. Попробуйте изменить значение Numpy по умолчанию с помощью 'np.set_printoptions (precision = 20)' или напечатать их другим способом. –

+0

Удивительный! Большое спасибо! –

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

  • Нет связанных вопросов^_^