我创建了一个检查数字是否不合理的函数:
function Verifie_infini($value) {
if(strlen(substr(strrchr($value, "."), 1))>= 10) {
return 1;
} else {
return 0;
}
}
但是当有大量数据时它不起作用:sqrt(1194739201)
它会返回0
你有想法还是确实存在更好的功能?
答案 0 :(得分:4)
如果val为无穷大(正或负),则返回TRUE,如 log(0)的结果或任何太大而无法放入浮点数的值 平台。
if(is_infinite($number))
{
#your code
}
答案 1 :(得分:1)
从上面的评论中,您正在寻找一种计算数学上精确平方根的方法。此问题属于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 = 2 3 ×3 2 ×7 2 ×11 2 ×13 1功能
然后,将每个权力除以2,这给了我们根的合理部分:
462 = 2 1 ×3 1 ×7 1 ×11 1 ×13 0功能
和休息(1s和0s)构成了不合理的部分
26 = 2 1 ×3 0 ×7 0 ×11 0 ×13 1功能