Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   kleinste Zahl in der Signifikanz (https://www.delphipraxis.net/167157-kleinste-zahl-der-signifikanz.html)

Panthrax 15. Mär 2012 16:19

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:

Eine Double-Zahl mit acht Byte (64 Bit) wird in drei Felder unterteilt: s: 1 Bit, e: 11 Bits und f: 52 Bits.

Der Wert v der Zahl ergibt sich folgendermaßen:
  • Wenn 0 < e < 2047, ist v = (-1)s * 2(e-1023) * (1.f)
  • Wenn e = 0 und f <> 0, ist v = (-1)s * 2(-1022) * (0.f)
  • Wenn e = 0 und f = 0, ist v = (-1)s * 0
  • Wenn e = 2047 und f = 0, ist v = (-1)s * Inf
  • Wenn e = 2047 und f <> 0, ist v ein NaN

(Quelle: http://docwiki.embarcadero.com/RADSt...Der_Typ_Double)

Um auf die Komponenten zuzugreifen könnte man den Wert zerlegen, etwa so:
Delphi-Quellcode:
type
  TDouble64Rec = record
    Sign: TValueSign; // Unit System.Math
    Exp: NativeInt;
    Frac: Double; // eben ohne Sign und Exp
  end;
Wie kann man nun L und R bestimmen?

gammatester 15. Mär 2012 16:38

AW: kleinste Zahl in der Signifikanz
 
Lade Dir meine AMath-Unit (http://wolfgang-ehrhardt.de/misc_de.html#amath_unit) und benutze die Funktionen
Code:
succd Return next representable double after d in the direction +Inf
predd Return next representable double after d in the direction -Inf

shmia 15. Mär 2012 16:38

AW: kleinste Zahl in der Signifikanz
 
Delphi-Quellcode:
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;
PS: das war jetzt die Quick & Dirty Methode, die aber meistens funktioniert

Medium 15. Mär 2012 16:48

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.

gammatester 15. Mär 2012 16:57

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;

r2c2 15. Mär 2012 17:42

AW: kleinste Zahl in der Signifikanz
 
Gibt es eigentlich einen Grund, warum man sowas haben wollte?

mfg

Christian

Panthrax 15. Mär 2012 19:11

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:

Zitat von r2c2 (Beitrag 1156762)
Gibt es eigentlich einen Grund, warum man sowas haben wollte?

Bspw. deswegen:
Code:
1.00000000000000E+0009 + 1.00000000000000E-0009 -> 1.00000000000000E+0009
http://de.wikipedia.org/wiki/Gleitko..._absorption.29

r2c2 15. Mär 2012 21:06

AW: kleinste Zahl in der Signifikanz
 
Zitat:

Zitat von Panthrax (Beitrag 1156773)
Zitat:

Zitat von r2c2 (Beitrag 1156762)
Gibt es eigentlich einen Grund, warum man sowas haben wollte?

Bspw. deswegen:
Code:
1.00000000000000E+0009 + 1.00000000000000E-0009 -> 1.00000000000000E+0009
http://de.wikipedia.org/wiki/Gleitko..._absorption.29

Ich weiß wie Floats funktionieren. Nur versteh ich nicht, warum man so etwas, wie du vor hast, tun wollte. Ich kann mir momentan keine echte Anwendung vorstellen. Wo sollte ich sowas brauchen? Um Absorption zu verhindern? Warum sollte ich die verhindern wollen? Die ist nur logisch.

mfg


Christian

Medium 15. Mär 2012 22:54

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.

r2c2 15. Mär 2012 23:25

AW: kleinste Zahl in der Signifikanz
 
Zitat:

Zitat von Medium (Beitrag 1156796)
Im wissenschaftlichen Umfeld, wo doch ganz gerne mal mit extremen Zahlen hantiert wird, ist das durchaus relevant.

Deshalb benutzt man für manche Anwendungen Festkommazahlen und eben gerade keine Floats.

Zitat:

Und sei es nur, um den möglicherweise den gemachten Fehler bei einer Rechnung quantitativ angeben zu können.
Das kannst du über Fehlerfortpflanzungsrechnung tun. Warum man dafür aber Floats inkrementieren muss, versteh ich nicht.

Zitat:

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.
Ich will ja nicht die Frage an sich als unberechtigt hinstellen. Interesse und Lust am Spielen sähe ich ja schon als Grund genug an. Meine Frage geht in zwei Richtungen:
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 23:58 Uhr.
Seite 1 von 2  1 2   

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