Γιατί η σύγκριση των float αριθμών μπορεί να είναι λανθασμένη και πώς να αντιμετωπίσουμε αυτό;
sobes.tech AI
Απάντηση από AI
Η σύγκριση αριθμών κινητής υποδιαστολής (float) μπορεί να είναι λανθασμένη λόγω των χαρακτηριστικών της αναπαράστασής τους στη μνήμη. Οι αριθμοί κινητής υποδιαστολής αποθηκεύονται σε μορφή IEEE 754, η οποία δεν μπορεί πάντα να αναπαραστήσει με ακρίβεια τα δεκαδικά κλάσματα, οδηγώντας σε σφάλματα στρογγυλοποίησης.
Για παράδειγμα, η έκφραση 0.1 + 0.2 == 0.3 μπορεί να επιστρέψει false λόγω μικρών αβεβαιοτήτων.
Για να αντιμετωπιστεί αυτό το πρόβλημα, συγκρίνουμε συνήθως τους αριθμούς λαμβάνοντας υπόψη μια μικρή διαφορά (epsilon):
const epsilon = 1e-9
func floatEquals(a, b float64) bool {
return math.Abs(a - b) < epsilon
}
Έτσι, αντί για άμεση σύγκριση a == b, ελέγχεται αν η διαφορά μεταξύ των αριθμών είναι αρκετά μικρή για να τους θεωρήσουμε ίσους. Αυτό βοηθά στην αποφυγή σφαλμάτων που σχετίζονται με την ανακριβή αναπαράσταση των αριθμών και τη συσσώρευση σφαλμάτων στους υπολογισμούς.