2017-11-04 2 views
1

Ich dachte, dass float maximal 6 Ziffern und double 15, nach Komma verwenden kann. Aber wenn ich drucken Grenzen here:Sollte Float 6 und Double 15 verfügbare Ziffern nicht floaten?

typedef std::numeric_limits<float> fl; 
typedef std::numeric_limits<double> dbl; 

int main() 
{ 
    std::cout << fl::max_digits10 << std::endl; 
    std::cout << dbl::max_digits10 << std::endl; 
} 

Er druckt float 9 und double 17?

+0

10 Binärziffern? – Vivick

+1

'Float kann maximal 6 Ziffern und Doppel 15, nach Komma 'ist falsch. Die Genauigkeit ist 15 Ziffern, die alle signifikanten Zahlen zählt, nicht nur die Nachkommastellen –

+0

@ LưuVĩnhPhúc: 15 Ziffern in Dezimal-Basis? max() auf double wird '2.22507e-308' ausgeben, was weit mehr als 15 Ziffern ist. – markzzz

Antwort

2

Von cppreference:

Anders als die meisten mathematischen Operationen, die Umwandlung eines Gleitkommawerts in Text und zurück ist genau so lange, wie mindestens max_digits10 verwendet wurden (9 für Schwimmer, 17 für Doppel): Es wird garantiert, dass derselbe Fließkommawert erzeugt wird, obwohl die Darstellung des Zwischentextes nicht exakt ist. Es kann mehr als hundert Dezimalstellen erfordern, um den genauen Wert eines Gleitkommas in Dezimalschreibweise darzustellen.

Zum Beispiel (I http://www.exploringbinary.com/floating-point-converter/ bin mit der Umwandlung zu erleichtern) und doppelt so die Präzision Format:

1.1e308 => 109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400

Mit 16 signifikanten Stellen:

1.099999999999999e308 => 109999999999999897424000903433019889783160462729437595463026208549681185812946033955861284690212736971153169019636833121365513414107701410594362313651090292197465320141992473263972245213092236035710707805906167798295036672550192042188756649080117981714588407890666666245533825643214495197630622309084729180160

Mit 17 signifikanten Stellen:

1.0999999999999999e308 => 109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400

, welche die gleichen wie die ursprünglichen

Mehr als 17 signifikante Stellen ist:

1.09999999999999995555e308 => 10999999999999999721601638016901047260179611457136589883558923032255826094030815581645587813841602621905144365142188758848785562373246360921626173333077332915605523438356348926425589276737606191259678002 4055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400

Weiter das gleiche wie das Original.

+0

was '109999999999999997216016380169010472601796114571365898835589230322558260940308155816455878138416026219051443651421887588487855623732463609216261733330773329156055234383563489264255892767376061912596780024055526930962873899746391708729279405123637426157351830292874541601579169431016577315555383826285225574400' von' 1.1e308'? – markzzz

+1

Wie zitiert: "Es kann mehr als hundert Dezimalstellen erfordern, um den genauen Wert eines Gleitkommas in Dezimalschreibweise darzustellen.". Es bedeutet, dass es unmöglich ist, "1.1e308" genau darzustellen – Amadeus

+0

: O Aber ich kann diesen Wert nicht in einer Variablen als doppelt speichern. Ich verstehe nicht, was es bedeutet: O 'int' max() ist' 2147483647'. Einfach so. 'double' max() Ausgabe' 1.79769e + 308', die ich nicht den "Wert" bekomme ... – markzzz

3

Sie sind verwirrend digits10 und max_digits10.

Wenn digits10 6 ist, dann jede Zahl mit sechs Dezimalstellen kann in dem Gleitkommamodus Typ umgewandelt werden, und zurück, und wenn der Artikel wieder auf sechs Dezimalstellen gerundet, erzeugt den ursprünglichen Wert.

Wenn max_digits10 9 ist, dann gibt es mindestens zwei Fließkommazahlen, die bei der Konvertierung in Dezimalzahlen die gleichen ersten 8 Dezimalziffern ergeben.

digits10 ist die Nummer, die Sie suchen, basierend auf Ihrer Beschreibung. Es geht darum, von dezimal zu binär Fließkommazahl zurück in dezimal zu konvertieren.

max_digits10 ist eine Zahl über die Konvertierung von binären Gleitkommazahlen in dezimale zurück in binäre Fließkommazahl.

+0

Siehe auch die handliche Tabelle "Ziffernbereiche für Round-Trips zu und von IEEE Binary Floating-Point" in der [Exploring Binary] (http://www.exploringbinary.com/number- von-Ziffern-benötigt-für-Round-Trip-Konvertierungen /) Blog.Aber – njuffa

0

Es gibt keine exakte Entsprechung zwischen Dezimalziffern und Binärziffern.

IEEE 754 einfache Genauigkeit verwendet 23 Bits plus 1 für die implizite führende 1. Doppelte Genauigkeit verwendet 52 + 1 Bits.

die äquivalente Dezimalgenauigkeit zu erhalten, verwenden

log10 (2^binary_digits) = binary_digits * log10 (2)

Für einfache Genauigkeit dieser

24 * log10 (2) = 7.22

und für das Doppelte Präzision

53 * log10 (2) = 15,95

Siehe here und auch die Wikipedia page, die finde ich nicht besonders präzise sein.