我创建了一个函数来检查一个数字是否无理:
function Verifie_infini($value) {
if(strlen(substr(strrchr($value, "."), 1))>= 10) {
return 1;
} else {
return 0;
}
}
但当有像sqrt(1194739201)
这样的大数字时,它就不起作用了,它会返回0
你有没有一个想法或者确实存在一个更好的功能?
is_infinite()
如果val为无穷大(正或负),则返回TRUE,如log(0)的结果或任何值太大而无法放入此的浮点值站台
if(is_infinite($number))
{
#your code
}
从上面的评论中,您正在寻找一种计算数学精确平方根的方法。这个问题属于符号计算领域,不能用浮点运算来解决。下面是一个(故意简化的)如何象征性地取平方根的例子:
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
然后,将每个幂除以二,这就给出了根的合理部分:
462=21×31×71
剩余部分(1和0)形成无理部分
26=21×30