我需要求解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必须是整数的约束避免了任何浮点数学问题。数学永远不会涉及小数。然而,我没有办法绝对证明直觉。
我不认为pow()足够准确,但你当然可以从pow(…,1/degree)开始,然后向上或向下走$n,直到$n**$degree与$integer匹配或交叉。(但是你自己实现**度,因为它内部使用pow())
pow()是一个近似值,它并不总是返回与精确结果最接近的值