Pourquoi GHCi donne-t-il une réponse incorrecte ci-dessous?
GHCi
λ> ((-20.24373193905347)^12)^2 - ((-20.24373193905347)^24)
4.503599627370496e15
Python3
>>> ((-20.24373193905347)**12)**2 - ((-20.24373193905347)**24)
0.0
MISE À JOUR J'implémenterais la fonction (^) de Haskell comme suit.
powerXY :: Double -> Int -> Double
powerXY x 0 = 1
powerXY x y
    | y < 0 = powerXY (1/x) (-y)
    | otherwise = 
        let z = powerXY x (y `div` 2)
        in  if odd y then z*z*x else z*z
main = do 
    let x = -20.24373193905347
    print $ powerXY (powerXY x 12) 2 - powerXY x 24 -- 0
    print $ ((x^12)^2) - (x ^ 24) -- 4.503599627370496e15
Bien que ma version ne semble pas plus correcte que celle fournie ci-dessous par @WillemVanOnsem, elle donne étrangement la bonne réponse pour ce cas particulier au moins.
Python est similaire.
def pw(x, y):
    if y < 0:
        return pw(1/x, -y)
    if y == 0:
        return 1
    z = pw(x, y//2)
    if y % 2 == 1:
        return z*z*x
    else:
        return z*z
# prints 0.0
print(pw(pw(-20.24373193905347, 12), 2) - pw(-20.24373193905347, 24))
          2.243746917640863e31 - 2.2437469176408626e31qui a une petite erreur d'arrondi qui est amplifiée. Ressemble à un problème d'annulation.
                
a^24est approximativement2.2437e31, et donc il y a une erreur d'arrondi qui produit cela.