簡體   English   中英

使用任意精度數學的log()算法示例

[英]Examples of log() algorithm using arbitrary precision maths

我正在尋找一種可以在PHP中實現的算法,以使用任意精度數學來獲取整數的自然log()。 我受到GMP庫的PHP覆蓋庫的限制(有關PHP中可用的GMP功能,請參見http://php.net/manual/zh/ref.gmp.php 。)

如果您知道可以轉換為PHP的通用算法,那也將是一個有用的起點。

我知道,PHP支持本機log()函數,但是我希望能夠使用任意精度來解決這個問題。

密切相關的是獲取exp()函數。 如果我的男生數學對我來說是正確的,得到一個可以導致另一個。

好吧,您將擁有泰勒級數,可以對其進行重寫以實現更好的收斂 ln的改進泰勒級數:2 sum_ {k = 0 .. + inf} 1 /(2k + 1)*((y-1)/(y + 1))^(2k + 1)

要將等式轉化為算法,您必須了解收斂級數的工作原理:每個項越來越小。 這種下降發生得足夠快,因此總和是一個有限值:ln(y)。

由於實數具有很好的屬性,因此您可以考慮將序列收斂到ln(y):

  • L(1)= 2/1 *(y-1)/(y + 1)
  • L(2)= 2/1 *(y-1)/(y + 1)+ 2/3 *((y-1)/(y + 1))^ 3
  • L(3)= 2/1 *(y-1)/(y + 1)+ 2/3 *((y-1)/(y + 1))^ 3 + 2/5 *((y-1 )/(y + 1))^ 5

.. 等等。

顯然,計算此序列的算法很簡單:

x = (y-1)/(y+1);
z = x * x;
L = 0;
k = 0;
for(k=1; x > epsilon; k+=2)
{
    L += 2 * x / k;
    x *= z;
}

在某個時候,您的x會變得如此之小,以至於它不再會影響L的有趣數字,而只會修改更小的數字。 如果這些修改對於您的目的而言太微不足道了,您可以停止。

因此,如果要達到1e ^ -20的精度,請將epsilon設置為比該值小得多,那么就可以了。


如果可以的話,請不要忘記在日志中進行分解。 例如,如果它是一個理想的正方形,則ln(a²)= 2 ln(a)實際上,當(y-1)/(y + 1)較小時,該級數將收斂得更快,因此,當y較小時(或更確切地說,更近)到1,但是如果您打算使用整數,則該值應該相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM