Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 2 von 4     12 34      

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