Sobes.tech
Middle

Miért lehet helytelen a float számok összehasonlítása, és hogyan kezeljük ezt?

sobes.tech MI

Válasz az MI-től

A lebegőpontos számok (float) összehasonlítása hibás lehet a memória szerinti reprezentációjuk sajátosságai miatt. A lebegőpontos számokat az IEEE 754 formátumban tárolják, amely nem mindig tud pontosan ábrázolni tizedes törteket, ami kerekítési hibákhoz vezet.

Például a 0.1 + 0.2 == 0.3 kifejezés kis hibák miatt hamis értéket adhat.

Ennek a problémának a kezelésére általában a számokat egy kis delta (epsilon) figyelembevételével hasonlítjuk össze:

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

Így ahelyett, hogy közvetlenül összehasonlítanánk a == b-t, ellenőrizzük, hogy a számok közötti különbség elég kicsi-e ahhoz, hogy egyenlőnek tekintsük őket. Ez segít elkerülni a számok pontatlan reprezentációjából és a számítások során felhalmozódó hibákból eredő problémákat.