Sobes.tech
Middle

Dlaczego porównanie liczb float może być niepoprawne i jak sobie z tym radzić?

sobes.tech AI

Odpowiedź od AI

Porównanie liczb zmiennoprzecinkowych (float) może być niepoprawne ze względu na cechy ich reprezentacji w pamięci. Liczby zmiennoprzecinkowe są przechowywane w formacie IEEE 754, który nie zawsze może dokładnie reprezentować dziesiętne ułamki, co prowadzi do błędów zaokrągleń.

Na przykład wyrażenie 0.1 + 0.2 == 0.3 może zwrócić false z powodu drobnych niedokładności.

Aby poradzić sobie z tym problemem, zwykle porównuje się liczby z uwzględnieniem małej delta (epsilon):

const epsilon = 1e-9
func floatEquals(a, b float64) bool {
    return math.Abs(a - b) < epsilon
}

W ten sposób, zamiast bezpośredniego porównania a == b, sprawdza się, czy różnica między liczbami jest wystarczająco mała, aby je uznać za równe. Pomaga to uniknąć błędów związanych z niedokładną reprezentacją liczb i gromadzeniem się błędów w obliczeniach.