Problem bei If Anweisung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
norbertA
User
Beiträge: 2
Registriert: Samstag 11. Januar 2014, 22:34

In dem nachfolgenden Script liefert die if Anweisung des 2. Teils kein Ergebnis, obwohl hier eines vorliegen muss.
Im 1. Teil mit anderen Werten funktioniert sie.
Hat jemand eine Idee?

Code: Alles auswählen

#Teil 1: funktioniert: Ergebnis 42 80 133
#for a in range (1,400):
 #   for b in range (1,400):
  #      for c in range (1,400):
   #         if a*2.3+b*3.06+c*3.92==862.76 and a+b+c==255:
    #    
     #           print a, b, c

#Teil 2 funktioniert nicht: es wird kein Wert berechnet, herauskommen muesste 207 79 37
for a in range (207,208):
    for b in range (79, 80):
        for c in range (37, 38):
            #print "input", a,b,c

            
            #eigentliche Aufgabe: funktioniert nicht
            if a*2.3+b*3.06+c*3.92==862.88:

            #Test: funktioniert nicht           
            #if (207*2.3)+(79*3.06)+(37*3.92)==862.88:
                
            #Test: funktioniert (ist eigentlich eine 2. Bedinging der Aufgabe, siehe Teil 1)
            #if a+b+c==323:
        
                print "output",a, b, c

#Nachweis, dass Ergebnis vorliegen muss!!
d=207*2.3+79*3.06+37*3.92
print "Pruefergebnis", d
Zuletzt geändert von Anonymous am Samstag 11. Januar 2014, 22:52, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hier werden Sie geholfen: http://floating-point-gui.de/
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

Man darf Gleitkommazahlen nicht einfach so miteinander vergleichen. Die sind nicht exakt:

Code: Alles auswählen

In [47]: 207*2.3+79*3.06+37*3.92 == 862.88
Out[47]: False

In [48]: 207*2.3+79*3.06+37*3.92
Out[48]: 862.8799999999999
Üblicherweise bildet man die Differenz zwischen den beiden Werten und schaut dann ob die kleiner als eine gewählte Genauigkeit ist:

Code: Alles auswählen

In [49]: abs(207*2.3+79*3.06+37*3.92 - 862.88) < 0.0001
Out[49]: True

In [50]: abs(207*2.3+79*3.06+37*3.92 - 862.88)
Out[50]: 1.1368683772161603e-13
Näheres zum Phänomen: http://floating-point-gui.de
norbertA
User
Beiträge: 2
Registriert: Samstag 11. Januar 2014, 22:34

Genial.
Vielen Dank, jetzt funktioniert es auch mit den anderen Aufgaben :D :D :D
BlackJack

@norbertA: Wenn ich mir das erste auskommentierte so anschaue: Da werden ≈63½ Millionen Tests gemacht, wo man auf den ersten Blick sehen kann das mindestens ≈23 Millionen davon gar nicht zum Ergebnis führen können weil `a` *alleine* bei denen schon grösser als die Summe in der zweiten Bedingung ist.
Antworten