AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Klatsch und Tratsch Warum kommt bei Gleitkommadivision durch 0 eine Exception?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum kommt bei Gleitkommadivision durch 0 eine Exception?

Ein Thema von Sherlock · begonnen am 30. Mai 2017 · letzter Beitrag vom 30. Mai 2017
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#1

Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 13:20
Wenn ich in C# ein float durch 0 teile erhalte ich Infinity. Gemäß IEEE 754, ein Standard an den sich MS erklärtermaßen hält, ist das auch das erwartete Ergebnis. Bei Delphi erhalten wir (gemäß Schulmathematik erwartungskonform "das gibt es nicht") eine Exception. Ich kann beiden Standpunkten folgen, denn schließlich ist 0,000000000000000000000000001 praktisch 0 aber 1/0,000000000000000000000000001 ist eine richtig große Zahl, warum dann nicht 1/0 als unendlich ausgeben?

Wie seht Ihr das Verhalten? Macht es die Arbeit in C# zB leichter oder schwerer? Vermisst Ihr das Verhalten in ObjectPascal?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 13:30
Im Ernst?
Na gut: mir ist die Exception lieber, weil ich unmißverständlich darauf gestoßen werde, daß ich eine ungültige Situation habe, die es zu klären gilt. Andernfalls käme es zu verfälschten Ergebnissen.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 13:36
Das wird über die ExceptionMask gesteuert.
D.h. du kannst das C#-Verhalten damit auch in Delphi bekommen.
Delphi lässt diese Maske unverändert, C# wird es (vermutlich wegen DirectDraw und Co.) Standardmäßig auf "schmeiß keine Exception" setzen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 13:57
Jupp, auch in Delphi kennen die Floats (Single/Double/Extendet) solche Zustände,
aber, wie bereits genannt, wir das nicht standardmäßig als "Fehlerwert" gesetzt, sondern löst die Fehlerbehandlung aus.

Infinity
NegInfinity
NaN
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 14:03
solange ich nicht "Unendlich" erwarte, ist mir die Exception lieber.
(irgendein Wert ist 0 geworden und ich hab nicht daran gedacht)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 14:46
Mir sind Exceptions auch lieber, dann kann man da wo das Problem auftritt auch darauf reagieren.
INFINITE oder auch NAN verschleppen das Problem meiner Meinung nach nur an eine andere Stelle.
Das ganze wird dann lustig wenn man in einer mixed Umgebung arbeitet, sprich eventuell Dlls aus anderen Sprachen einsetzt.
Da kann es schon mal passieren das die Dll das Controlword der FPU ändert. Ganz spassig ist, das in der RTL die FPU Funktionen
nicht Threadsave sind. Wir haben hier schon die tollsten Sachen gesehen. Da gibt es seit Jahren QC's dazu.
Fritz Westermann
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#7

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 15:16
Zitat:
Mir sind Exceptions auch lieber,...
Das kommt sicher auf die Situation an. Bei mir habe ich es in einigen Situationen so, dass Inf für mich eine Ergebnis ist, mit dem ich weiterarbeiten kann.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 15:59
Delphi weicht hier, wie so oft, vom Standard ab. In vielen Anwendungen haben wir die FPU-Exceptions abgeschaltet.

Windows:
Zitat:
By default, the system has all FP exceptions turned off. Therefore, computations result in NAN or INFINITY, rather than an exception.
(Quelle)

GNU C:
Zitat:
By default the exception is simply noted in the floating-point status word, and the program continues as if nothing had happened. The operation produces a default value, which depends on the exception [...]
(Quelle)

IEE 754 höchstselbst:
Zitat:
The 754 model encourages robust programs. It is intended not only for numerical analysts but also for spreadsheet users, database systems, or even coffee pots. The propagation rules for NaNs and infinities allow inconsequential exceptions to vanish. Similarly, gradual underflow maintains error properties over a precision's range.

When exceptional situations need attention, they can be examined immediately via traps or at a convenient time via status flags. Traps can be used to stop a program, but unrecoverable situations are extremely rare.
(Quelle)

Und:
Zitat:
IEEE 754 specifies trapping as an optional feature, required to be off by default, which
has been interpreted by C99 and Java to mean that IEEE 754 deprecates trapping as a
method of diagnosing errors.
(Quelle)

Auch in letzter Zeit sind "neuere" Sprachen wie Java und C# genau diesen Weg gegangen. Nur Delphi ist da wieder anders.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Warum kommt bei Gleitkommadivision durch 0 eine Exception?

  Alt 30. Mai 2017, 17:40
Zitat:
In der Mathematik ist das Ergebnis der Division durch Null nicht definiert.
So heißt ja erstmal die Grundaussage, somit macht es Delphi doch eigentlich ein bissl richtiger, als C# ?

Zitat:
Wenn ich in C# ein float durch 0 teile erhalte ich Infinity.
Dann läuft aber was falsch, wenn immer Infinity bei dir raus kommt.

+x \ 0 = Infinity
-x \ 0 = NegInfinity
0 \ 0 = NaN

0 durch x ist zwar "immer" 0, aber da das Ergebnis von x durch 0 nicht definiert ist, bleibt nur noch NaN.
Da x durch einen immer kleineren Wert gegen ±Unendlich strebt, hat man sich hier als "Sonderlösung" für Unendlich entschieden,
auch wenn es eigentlich kein definierter Wert ist, und wenn C# und Viele Andere sich nun standardmäßig für diese Lösung entscheideen, dann kann man davon halten, was man will.


https://de.wikipedia.org/wiki/Divisi...ion_durch_null
$2B or not $2B

Geändert von himitsu (30. Mai 2017 um 17:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:19 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