AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

kleinste Zahl in der Signifikanz

Ein Thema von Panthrax · begonnen am 15. Mär 2012 · letzter Beitrag vom 16. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#1

kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 16:19
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?
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 16:38
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 16:38
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
Andreas

Geändert von shmia (15. Mär 2012 um 16:41 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 16:48
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 16:57
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;
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#6

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 17:42
Gibt es eigentlich einen Grund, warum man sowas haben wollte?

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 19:11
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!

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
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#8

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 21:06
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 22:54
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#10

AW: kleinste Zahl in der Signifikanz

  Alt 15. Mär 2012, 23:25
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:50 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