double - Datentyp

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.

double - Datentyp

Beitragvon RedGuy » 19.07.2016, 15:24

Hi zusammen !!!

Bei meinem aktuellen Projekt reize ich die Größen von Datentypen 1:1 aus. Das Ganze in C# .NET 2.0 .

Jetzt meine Frage: wie viele bits (also binär gesehen) sieht ein double - Typ für den ganzzahligen Bereich vor ?
Also was für eine Zweierpotenz steckt in einem double ?


Ich könnte das zwar ausrechnen. Vielleicht weiß es einer ja gerade auswendig oder hat ein paar Daten parat ;) .


Ergänzung: Ich suche also, denke ich, den Zweierlogarithmus von 4,94065645841246544E-324 . Ich finde allerdings keinen (Taschen-)rechner dafür :( ...


Gruss
RedGuy
RedGuy
Manuel Hofmann
Establishment
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: double - Datentyp

Beitragvon EyDu » 19.07.2016, 15:56

Hallo.

Am besten liest du dir dazu den entsprechenden Wikipedia-Eintrag durch:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

Da ist alles besser erläutert, als man hier eben mal schreiben könnte. Und wenn du schon dabei bist, mache gleich mit

https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

weiter. Damit solltest du dann gerüstet sein ;-)
EyDu
 
Beiträge: 78
Registriert: 24.08.2002, 18:52
Wohnort: Berlin

Re: double - Datentyp

Beitragvon DerAlbi » 19.07.2016, 15:59

Du brauchst keinen Taschenrechner, wenn man etwas rechnen muss.
Den 2er-Logarithmus kann man sich z.B. von google ausrechnen lassen...
Google einfach mal nach "log(4,94065645841246544E-324)/log(2)" und du hast deine Antwort.

Ich finde das Ergebnis (-1074) aber angesichts des 11Bit-Exponenten aber etwas komnisch ^_^ vielleicht kann das jemand aufklären..
DerAlbi
Establishment
 
Beiträge: 177
Registriert: 20.05.2011, 05:37

Re: double - Datentyp

Beitragvon Krishty » 19.07.2016, 16:04

Ich verstehe die Frage so, dass er wissen möchte, wie viele fortlaufende ganzzahlige Werte er verlustfrei in einem double speichern kann. Das wäre zweimal die Kapazität der Mantisse (einmal positiv, einmal negativ) minus eins (weil die Null positiv und negativ vorkommt) …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6131
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: double - Datentyp

Beitragvon dot » 19.07.2016, 16:29

C# double folgt dem IEEE-754 binary64 Standard und hat daher eine 52-Bit Mantisse. Die Frage ist aber weiterhin: Wieso ist dir das wichtig?
Benutzeravatar
dot
Michael Kenzel
Establishment
 
Beiträge: 1601
Registriert: 06.03.2004, 19:10

Re: double - Datentyp

Beitragvon DerAlbi » 19.07.2016, 16:36

Njaaahh aber_fortlaufende_ Ganzzahlen kann man eigentlich double nicht speichern... man denke einfach nur mal an z.B: die "3". Dafür hat double, wie für so viele andere Zahlen, keine exakte Darstellung.
Deswegen wäre die Antwort vielleicht: es gibt keinen "ganzzahligen Bereich" im Datenraum des doubles oder irgendeines Floatingpoint-Formats. Es sind nunmal Gleitkommazahlen... die man ggf. durch eine verlustbehaftete Konvertierung auf Integers mappen kann...
DerAlbi
Establishment
 
Beiträge: 177
Registriert: 20.05.2011, 05:37

Re: double - Datentyp

Beitragvon Krishty » 19.07.2016, 16:50

DerAlbi hat geschrieben:man denke einfach nur mal an z.B: die "3". Dafür hat double, wie für so viele andere Zahlen, keine exakte Darstellung.
Doch: 1,5 * 2^1 ;) Guck hier: http://babbage.cs.qc.cuny.edu/IEEE-754/

Bis die Mantisse voll ist, lässt sich jedes int exakt darstellen. Sonst könnte ja z.B. JavaScript keine Schleifenzähler realisieren ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6131
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: double - Datentyp

Beitragvon RedGuy » 20.07.2016, 07:39

Hi !

@DerAlbi: Ups, ich hab die falche Zehnerpotenz gepostet. Die Zahl soll 1,79769313486231570E+308 lauten... Dann kommt man nämlich auf 1024.

@EyDu: Danke für die super Quelle(n) !!

Allerdings steht nirgendswo explizit die Zweierpotenz an sich.
Aus dem IEEE 754 double-precision binary floating-point format könnte ich nur wieder die 1,79769313486231570E+308 berechnen. Darüberhinaus komme ich nicht weit (bezüglich der Zweierpotenz).

@krishty:
Damit komme ich irgendwie nicht zurecht. Ist die Mantisse nicht einfach die 1,79769313486231570 ??

---

Also das Resultat wäre also: in einem double steckt als höchste Zweierpotenz die 2^1024,
da log2(1,79769313486231570E+308) = 1024.

Aber das kann nicht stimmen, denn selbst bei 2^63 ist wird double schon wieder negativ (fängt von vorne an) - das habe ich ausprobiert.
RedGuy
Manuel Hofmann
Establishment
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: double - Datentyp

Beitragvon RedGuy » 20.07.2016, 08:16

Hi !!!

Also habe nun das entgültige Resultat:

die höchste Zweierpotenz in einem double ist 2^63 = 9,22337203685478E+18

die höchste Zweierpotenz nach einem type cast von double nach long, welche eine nicht negative Zahl ergibt
ist allerdings seltsamerweiße 2^62 = 4611686018427387904 . Da geht wohl bei der Konvertierung was verloren, denn
ein long müsste ja normalerweiße 2^63 (+1bit Vorzeichen) aufweisen.



Um das herauszufinden habe ich folgende Programme geschrieben:

Code: Ansicht erweitern :: Alles auswählen
static void Main(string[] args)
{
for ( byte pos = 63 ; pos >= 0 ; pos-- )
{
double currentNumber = Math.Pow(2.0d, (double)pos);

if ( currentNumber > 0.0d )
{
Console.WriteLine(pos + ", " + currentNumber);
break;
}
}

Console.ReadLine();
}



bzw.

Code: Ansicht erweitern :: Alles auswählen
static void Main(string[] args)
{
for ( byte pos = 63 ; pos >= 0 ; pos-- )
{
long currentNumber = (long)(Math.Pow(2.0d, (double)pos));

if ( currentNumber > 0 )
{
Console.WriteLine(pos + ", " + currentNumber);
break;
}
}

Console.ReadLine();
}



Es gibt mir einfach die erste höchste Zweierpotenz heraus,
bei der ein double (bzw. ein long) nicht wieder bei negativ beginnt.


@dot: Ich hab also anstatt 62bits, 63bits heraus. Beim Long komme ich auch auf 62bits.
Ich will das wissen, da ich explizit die Datengröße ausreizen muss. Also z.B. binär die 62bits...

Gruss
RedGuy
Manuel Hofmann
Establishment
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: double - Datentyp

Beitragvon Schrompf » 20.07.2016, 08:46

Du bist wirklich wirklich wirklich auf dem falschen Dampfer. Dein Testprogramm berechnet, wie groß ein long ist. Aber nicht, bis zu welcher Zahl ein double eine Ganzzahl verlustfrei darstellen kann. Die Zweierpotenzen sind im Double bis 2^(2^(ExponentBits-1)) exakt darstellbar. Ein double hat 11 Bits Exponent als Zweierkomplement (glaube ich jedenfalls), also ist 2^(2^10) das Maximum, was Du insgesamt darstellen kannst. Das sind die vorhin genannten 1,8e+308. Was Du eigentlich nachprüfen müsstest, wäre die größte Zweierpotenz, bis zu der 2^x -1 noch exakt darstellbar wäre. Und das ist wie schon genannt 2^52.

Erklärung: Stell Dir eine Fließkommazahl so vor, wie als hättest Du eine Reihe Ziffern, und Du kannst Dir aussuchen, wo in der Ziffernfolge das Komma stehen soll. So in etwa:

123456789098765,0

oder

123456789,098765

oder

12345,6789098765

oder halt

0,123456789098765

Da hört es aber nicht auf. Fließkommazahlen können das Komma noch viel weiter raus setzen. Stell Dir also einfach Nullen vor, bis das Komma kommt. Also etwa so:

0,00000000123456789098765

oder in die Gegenrichtung:

1234567890987650000000000000,0

Der Exponent der Fließkommazahl bestimmt, wie weit raus Du das Komma schieben kannst. Aber Du willst wissen, wieviele Ganzzahlen Du verlustfrei darstellen kannst. Und das leitet sich nur aus der Anzahl Ziffern ab, also der Mantisse, weil Du für diesen Fall die Position des Kommas auf die Einerstelle festlegst.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3626
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: double - Datentyp

Beitragvon RedGuy » 20.07.2016, 09:19

Hi !

@Schrompf:
Also zunächst einmal Danke für deine Antwort.
Diese müsste ich allerdings ersteinmal studieren, da ich diese auf Anhieb nicht kapiere.


Aber grundsätzlich: Was ist falsch an meinem Testprogramm, die "Größe" (Zweierpotenz) vom double - Typ zu Fuß herauszufinden ?!?!
Das müsste doch eigentlich funktionieren ;) .

Gruss
RedGuy
Manuel Hofmann
Establishment
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: double - Datentyp

Beitragvon Matthias Gubisch » 20.07.2016, 10:25

Vielleicht so:

es gibt bei Flieskommazahlen einen Unterscheid zwischen der absolut maximal darstellbaren Zahl und der maximal "verlustfrei" darstellbaren Zahl.

Dein Testprogramm berechnet die absolut maximal darstellbare Zahl eines double wenn ich das richtig sehe.
Die ist im Endeffekt: MAX(Mantisse) * 2^Exponent

Die höchste Verlustfrei darstellbare Zahl sollte auf den ersten Blick MAX(Mantisse) sein.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Matthias Gubisch
Establishment
 
Beiträge: 260
Registriert: 01.03.2009, 20:09

Re: double - Datentyp

Beitragvon joggel » 20.07.2016, 11:29

Mal ne Frage von mir zwischendurch:
Ist es denn immer garantiert, das bei einem double-typ *ausschließlich* und *nur* die Mantisse zur darstellung verwendet wird, wenn die darzustellende Zahl kleiner als 2^52 ist?
bald mit neuem Avatar
Benutzeravatar
joggel
Establishment
 
Beiträge: 1202
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: double - Datentyp

Beitragvon Matthias Gubisch » 20.07.2016, 11:42

@RedGuy
hier: https://en.wikipedia.org/wiki/Double-pr ... int_format
und hier: https://docs.oracle.com/cd/E19957-01/80 ... dberg.html

ist die ganze Sache mit Floating Point und was ist warum darstellbar ganz gut erklärt.

@joggel:
Achtung Vermutung: Das hängt stark vond einer Zahl ab. Wenn du garantieren kannst dass die darzustellende Zahl eine Ganzzahl ist...., sobald Nachkommastellen ins Spiel kommen reicht die Mantisse ja nicht mehr aus.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Matthias Gubisch
Establishment
 
Beiträge: 260
Registriert: 01.03.2009, 20:09

Re: double - Datentyp

Beitragvon joggel » 20.07.2016, 12:01

Ja, ich meinte halt auch nur ganzzahlige Werte.
Was mich nur verwundert hat:
Krishty hat geschrieben:
DerAlbi hat geschrieben:man denke einfach nur mal an z.B: die "3". Dafür hat double, wie für so viele andere Zahlen, keine exakte Darstellung.
Doch: 1,5 * 2^1 ;) Guck hier: http://babbage.cs.qc.cuny.edu/IEEE-754/
[...]

Wenn für die "3" dazu die Mantisse doch aber ausreicht, wieso diese Zahl dann in eine "echte" Fließkommazahl umwandeln?

p.s.:
Passend zu dem Thema gerade gefunden^^
http://www.h-schmidt.net/FloatConverter/IEEE754de.html

Dank diesem IEEE 754-Umrechner verstehe ich das jetzt wie das mit den Fließkommazahlen läuft! :)
@RedGuy
Schaue dir diesen Umrechner mal an ;)
bald mit neuem Avatar
Benutzeravatar
joggel
Establishment
 
Beiträge: 1202
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Nächste

Zurück zu Algorithmen und Datenstrukturen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast