Autor |
Beitrag |
DeadlyAppearance
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Di 22.07.08 15:34
Ich grüße euch.
Und zwar folgendes Problem.
Delphi-Quelltext 1: 2: 3: 4: 5:
| var Eisen, Titan : Int64; Verhaeltnis : Single;
Verhaeltnis := RoundTo(Eisen/Titan,2); |
Das ganze funktioniert so lange bis Titan 0 ist, dann rappelt es.
Gibt es eine andere Möglichkeit außer mit if(Titan>0) dies abzufangen?
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 22.07.08 15:36
Was ist an der If-Abfrage so schlimm?
|
|
DeadlyAppearance 
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Di 22.07.08 15:39
Weil ich ca. 6 mal solch eine Rechnung in einer Schleife habe.
Dachte einmal aus Performancegründen kann es nicht schlecht sein 6 ifs zu sparen und mich interessiert es einfach, ob es einen anderen Lösungsweg gibt.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Di 22.07.08 15:43
Du kannst, da Du nicht auf die Exaktheit deiner Lösung
angewiesen bist (RoundTo), und die Annahme treffen kannst, dass Titan >= 0 ist,
folgendes machen:
Delphi-Quelltext 1:
| Verhaeltnis := RoundTo(Eisen/(Titan+0.00000001),2);] |
Allerdings wird wohl die Addition zweier Fließpunktzahlen die
If-Abfrage an Laufzeit übertreffen...
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mi 23.07.08 11:59
Hi,
Wenn es dir darum geht, die if-Abfrage nicht sechs Mal zu tippen, warum packst du das ganze nciht in eine eigene Prozedur?
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 23.07.08 12:10
Es geht ihm scheinbar nur um Performance und ich denke, dass 6-ifs immer noch das Performanteste sind, oder man an einer anderen Stelle optimieren sollte.
mfg
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Mi 23.07.08 13:39
Wenn ich mich recht erinner konnte man die ZeroDevide Exception im Coprozessor maskieren => assembler. Aber ich frage mich, wieso ein Rechnung bei der ein ungültiges Ergebnis entsteht überhaupt bei dir auftaucht.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mi 23.07.08 14:20
Allesquarks hat folgendes geschrieben: | ich frage mich, wieso ein Rechnung bei der ein ungültiges Ergebnis entsteht überhaupt bei dir auftaucht. |
Er.. Weil er 0 / 0 teilt?^^
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Mi 23.07.08 14:50
Das ist mir auch klar! Mann  Ich meinte mehr: Normalerweise nutzt man ein Programm um sinnvolle Sachen zu berechnen. Ich hab die Erfahrung gemacht, dass wenn man den richtigen Algorithmus wählt und sauber programmiert meistens auch solche "Aussetzer" gar nicht erst auftreten. Da er es ja offenbar in einer Schleife laufen lässt, würde ich sagen sind da einfach nur die Grenzen falsch
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 23.07.08 15:02
Für mich sieht das eher nach nem Rechner für irgendein Spiel aus, um irgendwelche Ressourcenstände zu berechnen oder sowas.
Und da sowas normalerweise vom Anwender händisch eingetippt wird, kann es schon passieren, dass jemand ne 0 einträgt.
Und die Exception "auszumaskieren" oder mit einem try ... except... end; zu unterdrücken, halte ich für ungeschickter, als sie einfach mit einer simplen If-Abfrage gar nicht erst auftreten zu lassen.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mi 23.07.08 16:36
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Mi 23.07.08 18:15
@Hidden: Ja schon gut. Hab mich vlt auch unverständlich ausgedrückt, woltle mich bei meinem Kenntnisstand über des Autors Problem aber auch nicht zu weit aus dem Fenster lehnen. Hättst dir aber auch denken können, dass ich das Problem schon gelesen habe.
@Problem, Xentar: Manchmal macht das durchaus Sinn die Exception zu maskieren. Erstens ist das keine zwingende, sonst könnte man sie nicht maskieren und zweitens stimmt das Ergebnis danach glaube ich sogar formal: nämlich NAN  . Damit kann man nur nicht wirklich gut weiterrechnen und ich denke das hilft ihm nicht, sondern er sollte das rauspatchen oder die Schleife so modifizieren, dass das Problem nicht auftritt.
|
|
DeadlyAppearance 
      
Beiträge: 113
Win 7
Delphi 2010 Arch., C# VS 2008
|
Verfasst: Fr 25.07.08 20:59
Wie bereits jemand sagte, kann man es meist mit sauberer Programmierung lösen.
Habe damals eine while Schleife etc. gehabt.
Nun habe ich eine Gleichung mit 2 unbekannten aufgestellt, welche einmal die while-Schleife erspart sowie keine 0 zurückliefert.
Trotzdem war/wäre es halt interessant gewesen, ob es außer if etwas gibt.
_________________ Als du auf die Welt kamst, weintest du, und um dich herum freuten sich alle. Lebe so, daß, wenn du die Welt verläßt, alle weinen und du allein lächelst.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 25.07.08 22:33
Hi,
Was hätte es denn außer 'if' geben sollen  Welches Ergebnis sollte denn bei 0/0 verarbeitet werden? 0/0 ist nunmal rein Mathematisch nicht definiert. Somit bräuchtest du gezwungenermaßen eine Sonderfallbehandlung.
Was du nun machst - da kann man noch sehen: imho betrachtest du es einfach als Null, das ist von der menschlichen Betrachtungsweise her einfach sm logischsten( if Titan = 0 then Verhaeltnis := 0;).
Edit: In den meißten Fälle sieht die Lösung zwar sowieso in der Art aus; die Exception an dieser Stelle dient dazu, dass sich der Programmierer bewusst ist, was passiert. Ansonsten könnte man sich unlogisches Verhalten manchmal nicht erklären.
Man stelle sich nur einmal so etwas vor: Das Ergebnis steigt mit sinkendem Titan immer weiter an, bis es bei 0 spontan auf 0 fällt.
Edit2: limes-Ausdruck in verständlcihen Satz gewandelt  Ich weiß, eig. war alles geklärt und ich hätte mir das hier sparen können.. Aber wo ich es schonmal geschrieben hatte, wollte cih es schon richtig machen
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
walter_b
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Mi 30.07.08 14:02
DeadlyAppearance hat folgendes geschrieben: | Weil ich ca. 6 mal solch eine Rechnung in einer Schleife habe.
Dachte einmal aus Performancegründen kann es nicht schlecht sein 6 ifs zu sparen und mich interessiert es einfach, ob es einen anderen Lösungsweg gibt. |
Ich weiss, dass dies eigentlich schon gelöst ist, aber auch ich will noch meinen Senf dazu geben... Mit Performance und ähnlichen Sachen hatte ich in letzter Zeit sehr viel zu tun. Bei mir wird eine if-Schleife 20 Millionen Mal aufgerufen, und der Performanceverlust, der dadurch entsteht, ist sehr gering. Bei 6 wirst du dies nicht mal spüren, ob da wirklich ein If drin ist oder nicht.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 30.07.08 14:06
walter_b hat folgendes geschrieben: | Bei mir wird eine if-Schleife... |
Ich habe noch nie(!) eine IF- Schleife in freier Wildbahn gesehen. Kannst Du mir zeigen, wie die aussieht?  For-, While- und Repeat-Schleifen kenne ich, aber eine If-Schleife nicht.
_________________ Na denn, dann. Bis dann, denn.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 30.07.08 14:19
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 30.07.08 14:27
Mit einem Link auf die Seite würde wenigstens die Seite eine IF-Schleife sein...
_________________ Na denn, dann. Bis dann, denn.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 30.07.08 14:43
Wobei ich finde, der Satz müsste eigentlich heißen "Es gibt keine If-Schleifen, sondern nur If-Blöcke". Denn Anfänger verwechseln Schleife mit Block:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for a := 1 to 100 do begin end;
if (bedingung) then begin end; |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 30.07.08 14:46
Das wäre der 'Then'-Block, als Alternative zum 'Else'-Block. If-Abfrage ist schon richtig.
_________________ Na denn, dann. Bis dann, denn.
|
|