Je suis en train d'écrire un programme qui utilise un algorithme de perception de réseau neuronal simple, j'ai du mal à faire de l'arithmétique flottante négative, quand je fais cela

summ = x1*w1+x2*w2-t

Summ obtient la valeur de -2.77555756156e-17

Cela ne se produit que lorsque x1 = 1.0 w1 = 0.2 x2 = 0.0 w2 = 0.1 t=0.2 Si je fais cela dans la console python, tout va bien, mais dans le programme, cela me donne cette valeur étrange. En fait, j'imprime chaque valeur et elles sont toutes normales, mais la sommation devient folle.

Voici le code complet http://tinypaste.com/1b8f9dd6 le calcul se fait en haut, dans le premier fonction.

Btw Im utilisant python 2.7, je suis confus comme l'enfer

0
abdu 21 nov. 2011 à 17:02

3 réponses

Meilleure réponse

Le nombre -2.77555756156e-17 est -0.0000000000000000277555756156, ce qui, comme vous pouvez le voir, est d'environ 0. Apparemment, vous vous attendez à zéro, mais l'arithmétique à virgule flottante n'est pas exacte pour la plupart des nombres. Voilà comment fonctionnent les mathématiques dans les ordinateurs.

Bien sûr, si vous tapez 1.0 * 0.2 + 0.0 * 0.1 - 0.2, vous obtenez la bonne réponse, mais votre programme effectue le calcul 1 * 0.19999999999999998 + 1 * 0 - 0.20000000000000001.

3
Gabe 21 nov. 2011 à 14:22

De Le guide des virgules flottantes:

Pourquoi mes chiffres, tels que 0,1 + 0,2, ne font-ils pas un bon tour de 0,3, et au lieu de cela j'obtiens un résultat bizarre comme 0.30000000000000004?

Parce qu'en interne, les ordinateurs utilisent un format (virgule flottante binaire) qui ne peut pas représenter avec précision un nombre comme 0,1, 0,2 ou 0,3.

Lorsque le code est compilé ou interprété, votre "0,1" est déjà arrondi au nombre le plus proche dans ce format, ce qui entraîne une petite erreur d'arrondi avant même le calcul.

3
Michael Borgwardt 21 nov. 2011 à 13:06

Un programme Python ne donnera pas de réponses différentes de celles obtenues sur la console, à condition que le même calcul soit effectué sur les mêmes données d'entrée.

Je pense donc que si vous vérifiez attentivement, vous verrez que les valeurs utilisées dans le programme diffèrent légèrement de celles utilisées sur la console. Avec les chiffres que vous donnez, le calcul retournera en effet précisément zéro, donc je pense que vous constaterez que les chiffres utilisés dans le programme ne sont pas tout à fait ce que vous pensez qu'ils sont.

Néanmoins, la virgule flottante n'est pas exacte. Il n'est précis qu'à une précision finie. Une fois que vous commencez à effectuer l'arithmétique, vous devez faire vos comparaisons avec une tolérance spécifiée plutôt qu'exacte. Pour tester zéro, vous devez vérifier que la valeur absolue du résultat est inférieure à une petite valeur de votre choix.

2
David Heffernan 21 nov. 2011 à 13:13
8212237