【发布时间】:2016-04-05 17:01:16
【问题描述】:
我需要求解具有整数根的任何 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 将使用浮点数。这是可取的,因为它不会溢出大整数;但是,它与浮点数学一起使用,这本质上是不准确的。但是这些不准确会影响我的算法吗?
再次,直观地我觉得 $integer 是整数和根 $n 必须是整数的约束避免了任何浮点数学问题。数学永远不会涉及小数。但是,我没有办法绝对证明这种直觉。
【问题讨论】:
-
您使用
pow()和倒数的事实意味着您涉及浮点数。 -
您可以使用支持任意大小和精度的数字的 BC 数学函数,但表示为字符串
标签: php algorithm math floating-accuracy