Seite 1 von 1

Problem bei If Anweisung

Verfasst: Samstag 11. Januar 2014, 22:45
von norbertA
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

Re: Problem bei If Anweisung

Verfasst: Samstag 11. Januar 2014, 22:54
von pillmuncher
Hier werden Sie geholfen: http://floating-point-gui.de/

Re: Problem bei If Anweisung

Verfasst: Samstag 11. Januar 2014, 22:57
von 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

Re: Problem bei If Anweisung

Verfasst: Samstag 11. Januar 2014, 23:15
von norbertA
Genial.
Vielen Dank, jetzt funktioniert es auch mit den anderen Aufgaben :D :D :D

Re: Problem bei If Anweisung

Verfasst: Sonntag 12. Januar 2014, 00:59
von 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.