【问题标题】:How to know if a number is irrational (infinite)如何知道一个数字是否无理(无限)
【发布时间】:2014-10-20 08:52:35
【问题描述】:

我创建了一个检查数字是否无理的函数:

function Verifie_infini($value) {
    if(strlen(substr(strrchr($value, "."), 1))>= 10) {
        return 1;
    } else {
        return 0;
    }
}

但是当有大数字时它不起作用:sqrt(1194739201)它返回0
您有想法或确实存在更好的功能吗?

【问题讨论】:

  • PHP 已经有一个实际工作的is_infinite() 函数。 if (is_infinite($value)) ....
  • “无限”可能是指十进制表示为无限的数字,即无理数。我认为这是不可行的,因为浮点算术适用于有理近似并且没有无理数的概念。
  • 是的,我会说无理数(对不起我的英语)。我认为数小数可以表明它是否是无理数。
  • @louis67: 是的,这是不可能的(想想:你怎么能count一个infinite数?)
  • @georg 是的,例如,我会检查这个数字是否有超过 10 个小数,然后说这是不合理的。我的功能适用于中小型数字,但在它不起作用之后。

标签: php numbers infinity


【解决方案1】:

is_infinite()

如果 val 是无限的(正或负),则返回 TRUE,例如 log(0) 的结果或任何太大而无法放入浮点数的值 平台。

if(is_infinite($number))
{
  #your code
}

【讨论】:

  • 是的,但是如果我将此函数与sqrt(2) 一起使用,例如它返回的不是无限的。
【解决方案2】:

从上面的 cmets 中,您正在寻找一种方法来计算数学上精确的平方根。此问题属于symbolic computation 的领域,无法通过浮点操作解决。下面是一个(特意简化的)如何象征性地取平方根的例子:

function factorize($n) {
    $factors = array();
    $p = 2;
    while($n > 1) {
        if($n % $p == 0) {
            $factors[$p]++;
            $n = intval($n / $p);
        } else $p++;
    }
    return $factors;
}

function symbolic_root($n) {
    $rat = $irr = 1;
    foreach(factorize($n) as $prime => $power) {
        $rat *= pow($prime, intval($power / 2));
        $irr *= pow($prime, intval($power % 2));
    }
    if($irr == 1) return $rat;
    if($rat == 1) return "sqrt $irr";    
    return "$rat * sqrt($irr)";
}

echo symbolic_root(1522756), "\n"; # prints "1234"
echo symbolic_root(5549544), "\n"; # prints "462 * sqrt(26)"

给好奇的人解释一下:

首先,我们将数字分解为素数:

5549544 = 23×32×72×112×131

然后,将每个幂除以二,得到根的有理部分:

462 = 21×31×71×111×130

其余部分(1 和 0)构成无理部分

26 = 21×30×70×110×131

【讨论】:

  • 我还没有完全理解,但这正是我要找的!现在我将尝试找到一个函数来确定分数是否可以是小数(例如:1/3 不是小数)
  • @louis67:看看这是否有帮助:stackoverflow.com/questions/8946310/…。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多