2017-09-10 2 views
0

Une spécification se lit comme suit:flotteurs en ignorant Comparer dernier bit dans golang

Il considère toujours des nombres réels égaux si elles diffèrent dans leur dernier chiffre binaire .

Je voudrais implémenter cette façon de comparer les flottants pour le type de données float64 dans Go. Malheureusement, les opérateurs au niveau du bit ne sont pas définis pour les nombres à virgule flottante. Existe-t-il un moyen d'obtenir cette façon de comparer les flottants dans la langue Go?

+0

Quelle est la "dernier chiffre binaire" d'un nombre réel? Peux-tu donner quelques exemples? –

+0

@PaulHankin J'essaie de reproduire le comportement d'un autre système et c'est la seule description que j'ai de la façon dont ce système gère les comparaisons. Mais dans mon test, votre 'almostEqual' donne le même résultat, je l'accepterai dans un moment après que d'autres auront eu la possibilité de répondre. Merci. –

Répondre

2

Si vous voulez savoir si deux valeurs float64 sont adjacentes (qui est, il n'y a pas de valeur float64 entre eux):

func almostEqual(a, b float64) bool { 
    ai, bi := int64(math.Float64bits(a)), int64(math.Float64bits(b)) 
    return a == b || -1 <= ai-bi && ai-bi <= 1 
} 

La plupart du temps c'est la même chose que dire qu'ils diffèrent dans le bit le plus bas de leur mantisse.

Ce code ne fonctionne pas si a ou b sont des NaNs, des zéros ou des infinis, mais vous pouvez ajouter des cas spéciaux si vous le souhaitez.

Voir https://randomascii.wordpress.com/2012/01/23/stupid-float-tricks-2/

3

Cela ressemble à un cas parfait d'utilisation pour la fonction suivante à partir du package de mathématiques:

func equal(x, y float64) bool { 
    return math.Nextafter(x, y) == y 
} 

nextafter retourne la prochaine représentable valeur float64 après x vers y.

Cas particuliers sont:
nextafter (x, x) = x
nextafter (NaN, y) = NaN
nextafter (x, NaN) = NaN

https://play.golang.org/p/unRkkoe6wb