![]() |
b <> 0
Hallo, ich hab nur eine Eleganzfrage, also es funktioniert schon.
Wie kann ich
Delphi-Quellcode:
eleganter machen? Ich hab diese Klausel sehr häufig, bei vielen Rechnungen kann bei b 0 rauskommen.
if b<>0 then
a:=a/b |
Re: b <> 0
Delphi-Quellcode:
Vielleicht auch so:
// Als Procedure
procedure MyDiv(var Dividend: Single; Divisor: Single); begin if (Divisor <> 0) then Dividend := Dividend / Divisor; end; // Als Funktion: function MyDiv(Dividend, Divisor: Single): Single; begin if (Divisor <> 0) then Result := Dividend / Divisor; end; // Aufrufe: // Procedure: MyDiv(Dividend, Divisor); // Funktion: Dividend := MyDiv(Dividend, Divisor);
Delphi-Quellcode:
[edit] Schöne Variablennamen ;) [/edit]
// Als Funktion, die true zurück gibt, wenn geteilt wurde:
function MyDiv(var Dividend: Single; Divisor: Single): Boolean; begin Result := Divisor <> 0; if (Result) then Dividend := Dividend / Divisor; end; // Aufruf if (MyDiv(Dividend,Divisor)) then // es wurde geteilt else // es wurde nicht geteilt |
Re: b <> 0
Macht er / mach ich doch oder hab ich was übersehen?
Mensch, Markus :mrgreen: Nicht wegeditieren :stupid: |
Re: b <> 0
Hallo,
dieses IF-Statement ist für sich genommen nicht verbesserungsfähig, lediglich bessere Variablennamen könnten eventuell noch Pluspunkte bringen. Grüße vom marabu |
Re: b <> 0
Zitat:
[edit] Hab sie geändert :stupid: [/edit] |
Re: b <> 0
ok danke, ich glaub ich lass es dann mal so, dann ist halt die zeile ein wenig länger. ich hab schon ziemlich viele eigene funktionen xD
|
Re: b <> 0
Hallo!
Du kannst auch einfach am Anfang von deinem Programm Set8087CW($133f); schreiben dann gibt es keine Fehler beim teilen durch 0 :) Liebe Grüsse Laufi |
Re: b <> 0
Zitat:
Und Fehlermeldungen unterdrücken ist nicht gerade sehr elegant, dann lieber programmseitig abfangen. |
Re: b <> 0
Ic C# könnte man es so machen, aber Delphi solche Konstrukte leider nicht:
Code:
Aber was hast du denn für ein Problem damit, deinen Code so zu verwenden wie du ihn hast :gruebel:
a = (b != 0) ? a / b : a;
Delphi-Quellcode:
Das ist grad mal 1 Zeichen mehr :mrgreen:
if b <> 0 then a := a / b;
|
Re: b <> 0
Delphi-Quellcode:
Result := IfThen(Divisor <> 0, Dividend/Divisor, Dividend);
|
Re: b <> 0
Das geht nicht (sofern nicht die FPU-Exception ausgeschaltet wird), denn Dividend/Divisor wird in jedem Fall ausgewertet.
|
Re: b <> 0
Check
|
Re: b <> 0
Ich weiß nicht in wie weit das unter Delphi mit Standardtypen möglich ist, sonst könntest du den / Operator überladen und das Typweit abfangen und dein Wunschergebnis zurückliefern
Delphi-Quellcode:
Getippt, nicht getestet
type
TMySingle = record Value: Single; class operator Divide(a: TMySingle; b: TMySingle): TMySingle; [...] class operator TMySingle.Divide(a: TMySingle; b: TMySingle): TMySingle; begin result.Value := a.Value; if b.Value <> 0 then result.Value := result.Value / b.Value end; |
Re: b <> 0
Zitat:
|
Re: b <> 0
da auf ungleich 0 geprüft wird kann man es auch gleich als Boolean interpretieren:
Delphi-Quellcode:
if Boolean(b) then
a := a / b; |
Re: b <> 0
Es ist schon sehr nett anzusehen, was alles zustande kommt, wenn man nur eine "poplige" Anweisung umschreiben möchte. :)
|
Re: b <> 0
Zitat:
isNAN entsteht dann, wenn man unendlich durch unendlich teilt. Diese Zustände des Unendlichen und "Not a Number" sind klar definiert für Fließkommazahlen bei IEEE (neben dem Unterschied zwischen +0 und -0). Unendlich oder NAN sind definiert wenn im Exponenten alle bits Gesetzt sind. Bei Unendlich ist die Mantisse 0 bei NAN <>0. |
Re: b <> 0
0/0 erzeugt auch NAN.
|
Re: b <> 0
Ist B eigentlich ein Integer, oder 'nen Float?
wenn B = Float (z.B. Single/Double/Extendet), dann ist ein genauer Vergleich doch nicht gut?
Delphi-Quellcode:
if not IsZero(b) then a := a / b;
bei B = Integer und größer 0 ginge auch noch sowas:
Delphi-Quellcode:
a := a / Max(b, 1);
|
Re: b <> 0
Du meintest wohl Max, den wenn b = 0 ist, ist b<1 und er teilt durch b, also 0 :wink:
Es scheint aber kein Integer zu sein, denn ansonsten würde es ohne Round(..) nicht funktionieren. |
Re: b <> 0
Zitat:
|
Re: b <> 0
Der Compiler weiss doch gar nicht, welche Werte die Variablen zur Laufzeit haben
|
Re: b <> 0
Ich meine doch, dass er aus
Delphi-Quellcode:
beim compilieren
if not b=0 then
Delphi-Quellcode:
macht.
if not IsZero(b) then
Eine ähnliche Diskussion habe ich hier neulich zum Thema
Delphi-Quellcode:
gelesen.
i:=i+1;
{bzw.} Inc(i); |
Re: b <> 0
Automatisch geht es nur andersrum: Durch Compliermagic wird aus
Delphi-Quellcode:
Inc(i);
Delphi-Quellcode:
i := i +1;
|
Re: b <> 0
nein, macht er nicht
i = 0 prüft, ob i genau dem Wert 0 entpsricht (halt "="), wärend IsZero eine nette Funktion ist, welche prüft ob i etwa/fast 0 entspricht. |
Re: b <> 0
Zitat:
|
Re: b <> 0
ich dachte eher der Compiler macht aus "i := i +1;" ein inc(i) :angel:
|
Re: b <> 0
Inc() ist eine Prozedur und diese wird wegrationalisiert.
Delphi-Quellcode:
wird natürlich als Inkrement implementiert
i := i + 1;
|
Re: b <> 0
die Prozedur INC gibt es nicht ... it's Compilermagic ... such die mal in deiner System.pas :zwinker:
wird beidest zu ASM-InlineCode "INC &var" aber von welchen Typ ist den nun das "b"? |
Re: b <> 0
Zitat:
|
Re: b <> 0
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz