我需要解决任何具有整数根的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必须是一个整数,避免了任何浮点数学问题。数学将永远不会涉及小数。但是,我无法绝对证明直觉。
答案 0 :(得分:0)
我不依赖于pow()足够准确,但你可以从pow(...,1 /度)开始,然后向上或向下走$ n直到$ n ** $ degree匹配或者越过$ integer。 (但是自己实施**度,因为在内部它使用pow())
pow()是一种近似值,并不总是将最接近的可能值返回到精确结果