【问题标题】:How to solve if an integer has an integer root?如果整数有整数根,如何解决?
【发布时间】: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


【解决方案1】:

我不会依赖 pow() 足够准确,但您当然可以从 pow(...,1/degree) 开始,然后向上或向下走 $n 直到 $n**$degree 匹配或与 $integer 交叉。 (但是自己实现 ** degree,因为它在内部使用 pow())

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

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多