使用Python在对数函数中精确

时间:2017-01-28 11:35:36

标签: python precision

我正在尝试绘制对数函数:x*log(1+1/x)表示非常大的x值。我已经检查了几个术语,因为整体情节不好,问题似乎是虽然这个函数永远不会高于1,但对于某些点,它变得大于1.我相信它与精确度有关。记录功能。

表示x的以下值:

[ 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]

正如您所看到的,第7个术语大于1。

我尝试使用log1p代替,但这给出了非感性的答案。

我也尝试使用np.float128(),但我得到的结果与上面完全相同。

有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分: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]