Delphi-PRAXiS

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

Medium 16. Mär 2012 01:20

AW: kleinste Zahl in der Signifikanz
 
Zitat:

Zitat von r2c2 (Beitrag 1156800)
Deshalb benutzt man für manche Anwendungen Festkommazahlen und eben gerade keine Floats.

Manchmal reicht es jedoch auch näherungsweise, so lange man den Fehler angeben kann. Im Prinzip hast du aber natürlich Recht.

Zitat:

Das kannst du über Fehlerfortpflanzungsrechnung tun. Warum man dafür aber Floats inkrementieren muss, versteh ich nicht.
Den Fehler aus systemischen Ungenauigkeiten kann man berechnen, der aufgrund der Darstellung entstehende dürfte etwas härter werden, wenn man den tatsächlich gemachten Fehler nicht quantifizieren kann, welcher bei Floats ja recht maßgeblich vom betroffenen Intervall abhängt. Selbst dann wird es noch recht fummelig, aber immerhin kann man beweisbare Dinge schreiben :)

Zitat:

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: [...]
Genehmigt! Mir kam die Infragestellung vom Wortlaut her wohl zu negativ rüber - nach dem Motto "Bissu blöd, wofür der Mist? Braucht doch kein normaler Mensch!" Mag aber auch an meiner heutigen Dosis blöder Dinge liegen. Hirn erwartet Gesetzt der Serie. Zweck hinterfragen ist sicherlich berechtigt, und es wäre nicht so, als würde mich nicht interessieren wofür der TE das einsetzen will! Klingt zumindest erstmal interessant.

Nichts für ungut! :cheers:

gammatester 16. Mär 2012 09:30

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 06:26 Uhr.

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