如果整数具有整数根,如何解决?

时间:2015-12-31 20:14:41

标签: php algorithm math floating-accuracy

我需要解决任何具有整数根的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;
}

我有两个问题:

幂函数是否足够接近整数根,以便舍入float永远不会返回错误的整数根?这需要它关闭0.5,直觉上我无法想象发生,但我没有艰难的证据。

其次,return语句是否需要十进制数学?问题是,对于足够大的$ integer和$ n,PHP将使用float。这是可取的,因为它不会溢出大整数;但是,它会使用浮点数学,这本身就具有不准确性。那些不准确会影响我的算法吗?

再次,直觉上我觉得$ integer是一个整数的约束,并且根$ n必须是一个整数,避免了任何浮点数学问题。数学将永远不会涉及小数。但是,我无法绝对证明直觉。

1 个答案:

答案 0 :(得分:0)

我不依赖于pow()足够准确,但你可以从pow(...,1 /度)开始,然后向上或向下走$ n直到$ n ** $ degree匹配或者越过$ integer。 (但是自己实施**度,因为在内部它使用pow())

pow()是一种近似值,并不总是将最接近的可能值返回到精确结果