Я создал функцию, которая проверяет, является ли число иррациональным или нет:
function Verifie_infini($value) {
if(strlen(substr(strrchr($value, "."), 1))>= 10) {
return 1;
} else {
return 0;
}
}
Но это не работает, когда есть большие числа, такие как: sqrt(1194739201)
это возвращение 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
Возвращает TRUE, если val бесконечен (положительный или отрицательный), как
результат log (0) или любое значение слишком большое, чтобы поместиться в число с плавающей точкой
Платформа.
if(is_infinite($number))
{
#your code
}