@Black_Fire_2

Ускорения цикла для подсчета корня?

Написал простенькую функцию, которая считает гипотенузу треугольника из данных post формы.
Но есть один нюанс, если ввести большие числа в ширину($weight) и высоту($height),
то цикл начинает медлить, то есть зависать.

Как я понимаю цикл for долго работает с большими числами(24343434343 и т.д.).
Есть конечно выход, это убрать "Итерационную формулу Герона"
и сделать подсчет корня при помощи встроенной функции sqrt()

Но возможно ли как-то оптимизировать цикл и ускорить его?
$weight = null;
$height = null;
 
 
function calc_hypotenuse($a,$b){
$result = 1;  
  
  if(is_numeric($a) && is_numeric($b)){    
    $token = ($a*$a) + ($b*$b);                                                         
    
    for($i = 1; $i <= $result; $i++){     
    $result = 1/2 * ($i + $token / $i);    
    }    
  }   
  else{
  return "<br> Ошибка: Чтобы найти гипотенузу, нужно все поля заполнить цифрами";
  }
  
  return "<br> Гипотенуза равна = ". round($result, 1);
}
 
 
if(isset($_POST["weight"]) && isset($_POST["height"]) ){
  $weight = $_POST["weight"];
  $height = $_POST["height"];
  echo calc_hypotenuse($weight,$height);
}


<form method="POST">
<p>Ширина: <input type="text" name="weight" /></p>
<p class ="block">Высота: <input type="text" name="height" /></p>
<br>
<input type="submit" value="Найти гипотенузу">
</form>


body{
font-size: 30px;
}
 
.block{
margin-top:10px;
margin-left:12px;
}
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас и формула Герона неверно задана, и условие завершения цикла кривое.
Напишете правильно, будет считать быстро.
Ответ написан
@maksam07
Как на счет:
function calc_hypotenuse($a, $b) {
  $x = $a > $b ? $a : $b;
  $y = $a < $b ? $a : $b;
  $z = $y;
  while(abs($x - $z) > 0.0001) {
    $x = ($x + $z) / 2;
    $z = $y * $y / $x;
  }
  return $x;
}
Ответ написан
@hesy
По формуле Пифагора:
function calch(int $a, int $b): float {
    return sqrt($a * $a + $b * $b);
}


Замер времени выполнения:
$startAt = microtime(true);

$result = calch(PHP_INT_MAX, PHP_INT_MAX); // 9223372036854775807

echo 'Результат: ' . $result . ', время работы: ' . microtime(true) - $startAt . ' сек.' . PHP_EOL;

// Результат: 1.3043817825333E+19, время работы: 2.288818359375E-5 сек.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы