Ok, @Henning Makholm déjà dit dans son commentaire, mais il n'a pas d'expliquer pourquoi c'est vraiment une meilleure solution.
Première chose à dire: quand on traite avec virgule flottante, nous devons toujours être conscient de la possibilité d'erreurs d'arrondi. Lorsque nous écrivons, [0.0, 0.1 .. 1.0]
nous devons être conscients que tous ces chiffres, sauf pour la première, qui ne sera pas sur les lieux exacts de dixièmes. Où nous avons besoin de ce genre de certitude, nous ne devons pas utiliser les flotteurs à tous.
Mais bien sûr, il existe de nombreuses applications pour lesquelles nous sommes le contenu avec raisonnable certainy, mais besoin de haut débit. C'est là que les flotteurs sont grands. Une application possible d'une telle liste pourrait être une simple trapèze intégration numérique:
trIntegrate f l r s = sum [ f x | x<-[l,(l+s)..r] ] * s - (f(l)+f(r))*s/2
nous allons tester ceci: trIntegrate ( \x -> exp(x + cos(sqrt(x) - x*x)) ) 1.0 3.0 0.1
=> 25.797334337026466
par rapport à 25.9144 une erreur de moins de un pour cent. Elle n'est pas exacte, bien sûr, mais c'est inhérent à la méthode de l'intégration.
Supposons maintenant que le flotteur plages ont été définis afin de toujours mettre fin à lors du passage de la bordure droite. Ensuite, il serait possible (mais on ne peut pas en être certain!) que seulement 20 valeurs plutôt que de 21 sont calculés dans la somme, parce que la dernière valeur de x
arrive à être 3.000000 quelque chose. On peut simuler cette
bad_trIntegrate f l r s = sum [ f x | x<-[l,(l+s)..(r-s)] ] * s - (f(l)+f(r))*s/2
puis, nous avons
bad_trIntegrate ( \x -> exp(x + cos(sqrt(x) - x*x)) ) 1.0 3.0 0.1
=> 21.27550564546988
urgh!
Cela n'a rien à voir avec de cacher les problèmes avec virgule flottante. C'est juste une méthode pour aider le programmeur à obtenir autour de ces problèmes plus facile. En fait, le résultat contre-intuitif de l' [1, 3 .. 10] :: Float
aide à se souvenir de ces problèmes!