![]() |
kleinste Zahl in der Signifikanz
Gegeben ist X: Double.
Gesucht sind die kleinsten L, R: Double, für die gilt: X - L < X < X + R. Umgangssprachlich: Gegeben ist eine Zahl X vom Typ Double. Gesucht sind zwei Zahlen L und R vom Typ Double. Dabei soll L so bestimmt werden, dass X := X - L zur nächst kleineren Zahl führt, die mit Double darstellbar ist; und soll R so bestimmt werden, dass X := X + R zur nächst größeren Zahl führt, die mit Double darstellbar ist. Der Typ Double ist so aufgebaut: Zitat:
![]() Um auf die Komponenten zuzugreifen könnte man den Wert zerlegen, etwa so:
Delphi-Quellcode:
Wie kann man nun L und R bestimmen?
type
TDouble64Rec = record Sign: TValueSign; // Unit System.Math Exp: NativeInt; Frac: Double; // eben ohne Sign und Exp end; |
AW: kleinste Zahl in der Signifikanz
Lade Dir meine AMath-Unit (
![]()
Code:
succd Return next representable double after d in the direction +Inf
predd Return next representable double after d in the direction -Inf |
AW: kleinste Zahl in der Signifikanz
Delphi-Quellcode:
PS: das war jetzt die Quick & Dirty Methode, die aber meistens funktioniert
procedure TForm1.Button1Click(Sender: TObject);
var x, x1, x2, L, R : Double; begin x := 42.0; // Beispielwert x := Abs(x); x1 := x; x2 := x; Inc(PInt64(@x1)^); Dec(PInt64(@x2)^); L := x1 - x; R := x - x2; ShowMessageFmt('%e / %e', [L,R]); end; |
AW: kleinste Zahl in der Signifikanz
Was einem da nur fies in die Suppe spucken kann, sind denormalisierte Darstellungen, bzw. wenn das Inkrement/Dekrement via Übertrag mehr als nur die Mantisse beeinflusst. Was in solchen Grenzfällen zu tun wäre, wüsste ich aus dem Stegreif leider auch nicht, aber das wären die Knackpunkte, die ggf. eine Sonderbehandlung benötigen würden.
|
AW: kleinste Zahl in der Signifikanz
Schau Dir doch einfachen den Opensource der Amath-Unit an.
Delphi-Quellcode:
{---------------------------------------------------------------------------}
function predd(d: double): double; {-Return next representable double after d in the direction -Inf} begin with TDblRec(d) do begin if THexDblW(d)[3] and $7FF0=$7FF0 then begin {Inf or Nan} if (hm and $7FFFFFFF=$7FF00000) and (lm=0) then begin {d is +- Inf} if d>0.0 then d := MaxDouble; end; end else begin {finite number} if d=0.0 then begin hm := x80000000; lm := 1; end else if d<0.0 then begin {d<0: increment significand} inc(lm); if lm=0 then inc(hm); end else begin {d>0: decrement significand} if lm=0 then dec(hm); dec(lm); end; end; predd := d; end; end; |
AW: kleinste Zahl in der Signifikanz
Gibt es eigentlich einen Grund, warum man sowas haben wollte?
mfg Christian |
AW: kleinste Zahl in der Signifikanz
Vielen Dank!
Hab's mir angesehen und verstanden. Anfangs hatte ich mir das schwieriger vorgestellt. Insbesondere wegen der Sonderfälle +Inf, -Inf und NaN. Es von der Lösung her zu verstehen ist viel leichter. Vielen Dank! AMath scheint eine wahre Fundgrube zu sein! :thumb: Zitat:
Code:
1.00000000000000E+0009 + 1.00000000000000E-0009 -> 1.00000000000000E+0009
![]() |
AW: kleinste Zahl in der Signifikanz
Zitat:
mfg Christian |
AW: kleinste Zahl in der Signifikanz
Im wissenschaftlichen Umfeld, wo doch ganz gerne mal mit extremen Zahlen hantiert wird, ist das durchaus relevant. Und sei es nur, um den möglicherweise den gemachten Fehler bei einer Rechnung quantitativ angeben zu können. Selbst wenn es "nur" Interesse ist sehe ich keinen Grund das in Frage zu stellen, zumal es ja nun eine durchaus machbare Sache zu sein scheint.
|
AW: kleinste Zahl in der Signifikanz
Zitat:
Zitat:
Zitat:
a) Es gibt Leute, die Floats nicht verstehen und diesen Thread lesen. Und dann kommen sie womöglich auf dumme Gedanken. Aber viel wichtiger: b) Das ich momentan keinen sinnvollen Einsatz sehe, heißt nicht, dass es diesen nicht gibt. Und wenn hier jemand einen nennt, hab ich was dazu gelernt und andere auch. Und selbst wenn keiner einen nennen kann, entsteht vielleicht eine interessante Diskussion aus der man vielleicht was anderes lernen kann... mfg Christian |
AW: kleinste Zahl in der Signifikanz
Zitat:
Zitat:
Zitat:
Nichts für ungut! :cheers: |
AW: kleinste Zahl in der Signifikanz
Wofür braucht man sowas?
Das haben sich wahrscheinlich die Autoren von ISO_IEC_10967-1/2/3, des POSIX- und ISO-C99 Standards, Java etc auch gefragt. Offensichtlich haben sich das die Delphi-Entwickler aber nicht gefragt und in ihrer unendlichen Weisheit beschlossen, daß Otto Normalklickklack das nicht braucht. Leider ist Delphi relativ ungeeignet für wissenschaftliches Rechnen, wo doch wohl eher mit Fließkomma gearbeitet wird. Das ist unter anderem an der mangelhaften Math-Unit abzulesen. Während praktisch alle anderen Sprachen Funktionen für succf, predf, ulp haben (ADA: SUCCESSOR PREDECESSOR UNIT_LAST_PLACE, ISO Full Basic: SUCC PRED ULP, FORTRAN: NEAREST, C, C++, Java: nextafter, ulp, etc.), sucht man sowas bei Borland/Inprise/Emba vergebens. Dafür jede Menge Bugs und schlampige Implementationen. (Für C++ haben sie es wohl eingesehen und -zumindest für einige Zeit- die Dinkumware-Library dazu gepackt, wie ist es bei XE/2?). Als Ausgleich gibt es in Delphi's Math-Unit dafür allerdings echt geile unsinnige Funktionen wie ifthen, iszero etc. Dies waren die Hauptgrunde für die Entwicklung für AMAth. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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