Php 如何知道一个数字是否无理(无限)

Php 如何知道一个数字是否无理(无限),php,numbers,infinity,Php,Numbers,Infinity,我创建了一个函数,用于检查数字是否为无理数: function Verifie_infini($value) { if(strlen(substr(strrchr($value, "."), 1))>= 10) { return 1; } else { return 0; } } 但是当有像:sqrt(1194739201)it返回0 你有没有一个更好的功能 如果val为无穷大(正或负),则返回TRUE,如 日志(0)的结果或任何太

我创建了一个函数,用于检查数字是否为无理数:

function Verifie_infini($value) {
    if(strlen(substr(strrchr($value, "."), 1))>= 10) {
        return 1;
    } else {
        return 0;
    }
}
但是当有像:
sqrt(1194739201)
it返回
0

你有没有一个更好的功能

如果val为无穷大(正或负),则返回TRUE,如 日志(0)的结果或任何太大而无法放入此计算机上的浮点值的值 站台

如果val为无穷大(正或负),则返回TRUE,如 日志(0)的结果或任何太大而无法放入此计算机上的浮点值的值 站台


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

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


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

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


PHP已经有了一个实际工作的函数
if(is_infinite($value))…
所说的“infinite”可能指十进制表示为无限的数字,即无理数。我不认为这是可行的,因为浮点算术与有理近似一起工作,没有非有理数的概念。是的,我会说非有理数(对不起我的英语)。我想数一数小数可以表示它是否是无理数。@louis67:是的,这是不可能的(想想:你怎么能数出一个无限数?@georg是的,例如,我会检查这个数字是否有超过10个小数,然后说这是不合理的。我的函数适用于中小型数字,但之后它就不起作用了。PHP已经有了一个实际起作用的函数
if(is_infinite($value))…
所说的“infinite”可能指十进制表示为无限的数字,即无理数。我不认为这是可行的,因为浮点算术与有理近似一起工作,没有非有理数的概念。是的,我会说非有理数(对不起我的英语)。我想数一数小数可以表示它是否是无理数。@louis67:是的,这是不可能的(想想:你怎么能数出一个无限数?@georg是的,例如,我会检查这个数字是否有超过10个小数,然后说这是不合理的。我的函数适用于中小型数字,但之后就不起作用了。是的,但如果我将此函数与
sqrt(2)
一起使用,它返回的不是无限的。是的,但如果我将此函数与
sqrt(2)
一起使用,它返回的不是无限的。我还不完全理解,但这正是我要寻找的!现在我将尝试找到一个函数来确定一个分数是否可以是十进制的(例如:1/3不是十进制的)@louis67:看看这是否有帮助:。祝你好运我不完全明白,但这正是我要找的!现在我将尝试找到一个函数来确定一个分数是否可以是十进制的(例如:1/3不是十进制的)@louis67:看看这是否有帮助:。祝你好运