2015-12-31 84 views
1

我需要解決任何程度n的根,它有一個整數根。我最初的想法是用牛頓的方法找到近似的根,然而,冪函數不會給我們機器浮子可以表示的最大精度嗎?如何解決一個整數是否具有整數根?

function hasIntegerRoot($integer, $degree) { 
    if($degree == 0 || $degree == 1) return true; 

    $r = pow($integer, 1/$degree); 

    //get nearest integer 
    $n = round($r); 

    //solve n^x 
    $answer = pow($n, $degree); 

    return $answer == $integer; 
} 

我有兩個問題:

是否冪函數解決足夠接近整數根這樣四捨五入浮動絕不會返回錯誤的整數根?這將要求它減少0.5,這在直覺上我無法想象發生,但我沒有任何艱苦的證據。

其次,return語句是否需要十進制數學?問題是,對於足夠大的$ integer和$ n,PHP將使用float。這是可取的,因爲它不會溢出大整數;然而,它使用浮點數學,這本質上具有不準確性。那些不準確性會影響我的算法嗎?

同樣,直覺上我覺得$ integer是一個整數,並且根$ n必須是一個整數,這可以避免任何浮點數學問題。數學不會涉及小數。但是,我無法絕對證明直覺。

+0

事實上,你正在使用'pow()'和互惠意味着你涉及浮動。 –

+0

您可以使用支持任意大小和精度的數字的BC數學函數**,但**表示爲字符串 –

回答

0

我不會依賴pow()對此足夠準確,但是您肯定可以從pow(...,1/degree)開始,然後向上或向下行走$ n,直到$ n ** $ degree匹配或穿越$整數。 (但自己實現**度,因爲在內部它使用POW())

POW()是近似值並不總是最接近的可能值返回確切的結果

相關問題