![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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