Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi b <> 0 (https://www.delphipraxis.net/114321-b-0-a.html)

vsilverlord 23. Mai 2008 11:28


b <> 0
 
Hallo, ich hab nur eine Eleganzfrage, also es funktioniert schon.
Wie kann ich
Delphi-Quellcode:
if b<>0 then
a:=a/b
eleganter machen? Ich hab diese Klausel sehr häufig, bei vielen Rechnungen kann bei b 0 rauskommen.

Die Muhkuh 23. Mai 2008 11:30

Re: b <> 0
 
Delphi-Quellcode:
// 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);
Vielleicht auch so:

Delphi-Quellcode:
// 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
[edit] Schöne Variablennamen ;) [/edit]

Die Muhkuh 23. Mai 2008 11:33

Re: b <> 0
 
Macht er / mach ich doch oder hab ich was übersehen?

Mensch, Markus :mrgreen: Nicht wegeditieren :stupid:

marabu 23. Mai 2008 11:38

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

Die Muhkuh 23. Mai 2008 11:41

Re: b <> 0
 
Zitat:

Zitat von marabu
dieses IF-Statement ist für sich genommen nicht verbesserungsfähig, lediglich bessere Variablennamen könnten eventuell noch Pluspunkte bringen.

Das ist klar. Ich hab der Einfachheit halber seine Variablennamen verwendet. Die kann er ja dann ändern, wie er mag. :)

[edit] Hab sie geändert :stupid: [/edit]

vsilverlord 23. Mai 2008 11:59

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

Laufi 23. Mai 2008 12:20

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

Die Muhkuh 23. Mai 2008 12:23

Re: b <> 0
 
Zitat:

Zitat von Laufi
Du kannst auch einfach am Anfang von deinem Programm Set8087CW($133f); schreiben dann gibt es keine Fehler beim teilen durch 0 :)

Was passiert, wenn Du es trotzdem machst? (Also was steht nachher in der zugewiesenen Variable?)

Und Fehlermeldungen unterdrücken ist nicht gerade sehr elegant, dann lieber programmseitig abfangen.

Jelly 23. Mai 2008 12:24

Re: b <> 0
 
Ic C# könnte man es so machen, aber Delphi solche Konstrukte leider nicht:

Code:
a = (b != 0) ? a / b : a;
Aber was hast du denn für ein Problem damit, deinen Code so zu verwenden wie du ihn hast :gruebel:

Delphi-Quellcode:
if b <> 0 then a := a / b;
Das ist grad mal 1 Zeichen mehr :mrgreen:

spaxxn 23. Mai 2008 12:29

Re: b <> 0
 
Delphi-Quellcode:
Result := IfThen(Divisor <> 0, Dividend/Divisor, Dividend);

Apollonius 23. Mai 2008 12:31

Re: b <> 0
 
Das geht nicht (sofern nicht die FPU-Exception ausgeschaltet wird), denn Dividend/Divisor wird in jedem Fall ausgewertet.

spaxxn 23. Mai 2008 12:35

Re: b <> 0
 
Check

inherited 23. Mai 2008 12:56

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:
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;
Getippt, nicht getestet

3_of_8 23. Mai 2008 13:03

Re: b <> 0
 
Zitat:

Zitat von Die Muhkuh
Zitat:

Zitat von Laufi
Du kannst auch einfach am Anfang von deinem Programm Set8087CW($133f); schreiben dann gibt es keine Fehler beim teilen durch 0 :)

Was passiert, wenn Du es trotzdem machst? (Also was steht nachher in der zugewiesenen Variable?

+/-Infinity, je nach Vorzeichen des Dividenden und der 0.

SirThornberry 23. Mai 2008 13:20

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;

Die Muhkuh 23. Mai 2008 13:22

Re: b <> 0
 
Es ist schon sehr nett anzusehen, was alles zustande kommt, wenn man nur eine "poplige" Anweisung umschreiben möchte. :)

sirius 23. Mai 2008 14:04

Re: b <> 0
 
Zitat:

Zitat von 3_of_8
Zitat:

Zitat von Die Muhkuh
Zitat:

Zitat von Laufi
Du kannst auch einfach am Anfang von deinem Programm Set8087CW($133f); schreiben dann gibt es keine Fehler beim teilen durch 0 :)

Was passiert, wenn Du es trotzdem machst? (Also was steht nachher in der zugewiesenen Variable?

+/-Infinity, je nach Vorzeichen des Dividenden und der 0.

Und überprüfen kann man dass dann mit isInfinite bzw. isNAN.

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.

3_of_8 23. Mai 2008 14:15

Re: b <> 0
 
0/0 erzeugt auch NAN.

himitsu 23. Mai 2008 15:17

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);

Fussball-Robby 23. Mai 2008 15:22

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.

everdream 23. Mai 2008 15:56

Re: b <> 0
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
if not IsZero(b) then a := a / b;

Ich könnte mir vorstellen, dass Delphi da beim compilieren selbst drauf kommt. Kann das jemand bestätigen oder widerlegen?

mkinzler 23. Mai 2008 16:24

Re: b <> 0
 
Der Compiler weiss doch gar nicht, welche Werte die Variablen zur Laufzeit haben

everdream 23. Mai 2008 18:09

Re: b <> 0
 
Ich meine doch, dass er aus
Delphi-Quellcode:
if not b=0 then
beim compilieren
Delphi-Quellcode:
 if not IsZero(b) then
macht.

Eine ähnliche Diskussion habe ich hier neulich zum Thema
Delphi-Quellcode:
i:=i+1;
{bzw.} 
Inc(i);
gelesen.

mkinzler 23. Mai 2008 18:12

Re: b <> 0
 
Automatisch geht es nur andersrum: Durch Compliermagic wird aus
Delphi-Quellcode:
Inc(i);
Delphi-Quellcode:
i := i +1;

himitsu 23. Mai 2008 18:17

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.

everdream 23. Mai 2008 18:54

Re: b <> 0
 
Zitat:

Zitat von mkinzler
Automatisch geht es nur andersrum: Durch Compliermagic wird aus
Delphi-Quellcode:
Inc(i);
Delphi-Quellcode:
i := i +1;

Aber ist nicht Inc(i) (sowohl auf Delphi-, als auch auf ASM-Ebene) schneller als die herkömmliche Addition?

himitsu 23. Mai 2008 19:00

Re: b <> 0
 
ich dachte eher der Compiler macht aus "i := i +1;" ein inc(i) :angel:

mkinzler 23. Mai 2008 19:04

Re: b <> 0
 
Inc() ist eine Prozedur und diese wird wegrationalisiert.
Delphi-Quellcode:
i := i + 1;
wird natürlich als Inkrement implementiert

himitsu 23. Mai 2008 19:21

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"?

mkinzler 23. Mai 2008 19:23

Re: b <> 0
 
Zitat:

die Prozedur INC gibt es nicht ... it's Compilermagic ... such die mal in deiner System.pas Zwinkern
Sag ich doch.

grenzgaenger 24. Mai 2008 08:38

Re: b <> 0
 
Zitat:

Zitat von vsilverlord
Hallo, ich hab nur eine Eleganzfrage, also es funktioniert schon.
Wie kann ich
Delphi-Quellcode:
if b<>0 then
a:=a/b
eleganter machen? Ich hab diese Klausel sehr häufig, bei vielen Rechnungen kann bei b 0 rauskommen.

sag mal, weshalb lässt du es so weit kommen? prüfe doch gleich die eingabe ab, damit du im programm nur gültige daten hast. für den rest, musste aber schon validieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz