std::hypot în C++

Calculează ipotenuza, adică √(x² + y²), fără depășiri la valori mari; din C++17 și în 3 dimensiuni.

Sintaxă
double hypot(double x, double y);
double hypot(double x, double y, double z);  // C++17

Ce face std::hypot

std::hypot(x, y) returnează lungimea ipotenuzei unui triunghi dreptunghic cu catetele x și y, adică distanța de la origine la punctul (x, y). Este mai sigur decât sqrt(x*x + y*y), pentru că evită depășirea când x sau y sunt foarte mari sau foarte mici.

Varianta cu trei argumente (C++17) calculează distanța în spațiu: √(x² + y² + z²).

Parametri

Parametru Descriere
x, y, z Componentele (z opțional).

Ce returnează

Lungimea, ca double.

Exemple

Exemplul 1: Ipotenuză și distanță între două puncte

#include <cmath>
#include <print>

int main() {
    std::println("hypot(3, 4) = {}", std::hypot(3.0, 4.0));

    double x1 = 1, y1 = 2;
    double x2 = 7, y2 = 10;
    std::println("Distanța: {}", std::hypot(x2 - x1, y2 - y1));
    std::println("Diagonala unei cutii 2x3x6: {}", std::hypot(2.0, 3.0, 6.0));
}

Rezultat

hypot(3, 4) = 5
Distanța: 10
Diagonala unei cutii 2x3x6: 7

Exemplul 2: Fără depășire

x * x depășește valoarea maximă a lui double și devine inf; hypot dă rezultatul corect.

#include <cmath>
#include <print>

int main() {
    double x = 1e200;
    double y = 1e200;
    std::println("sqrt(x*x + y*y) = {}", std::sqrt(x * x + y * y));
    std::println("hypot(x, y)     = {:.4e}", std::hypot(x, y));
}

Rezultat

sqrt(x*x + y*y) = inf
hypot(x, y)     = 1.4142e+200

Greșeli frecvente

  • Folosești hypot doar ca să compari distanțe. Dacă ai nevoie doar de comparație, compararea pătratelor (fără radical) este mai rapidă.

Comenzi înrudite

  • std::sqrt: Calculează rădăcina pătrată (sqrt) sau rădăcina cubică (cbrt) a unui număr.
  • std::atan2: Calculează unghiul punctului (x, y) față de axa orizontală, între -π și π, ținând cont de cadran.
  • std::complex: Numere complexe (a + bi), cu operațiile aritmetice obișnuite, modul, argument și funcții matematice.