Autor Beitrag
DeadlyAppearance
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: Di 22.07.08 15:34 
Ich grüße euch.

Und zwar folgendes Problem.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 22.07.08 15:36 
Was ist an der If-Abfrage so schlimm?
DeadlyAppearance Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 23.07.08 14:20 
user profile iconAllesquarks 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 23.07.08 16:36 
user profile iconAllesquarks hat folgendes geschrieben:
Das ist mir auch klar! Mann :?:

Hey, nichts für ungut ;) :beer:

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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 :wink:. 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

Win 7
Delphi 2010 Arch., C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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 :mrgreen: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: Mi 30.07.08 14:02 
user profile iconDeadlyAppearance 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 30.07.08 14:06 
user profile iconwalter_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? :wink: For-, While- und Repeat-Schleifen kenne ich, aber eine If-Schleife nicht.

_________________
Na denn, dann. Bis dann, denn.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 30.07.08 14:19 
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.