Tatsächliche doppelte Präzision nicht einverstanden mit std :: numeric_limits
-
23-09-2019 - |
Frage
Arbeiten auf Mac OS X 10.6.2, Intel, mit i686-Apfel-darwin10-g ++ - 4.2.1 und mit dem -arch x86_64-Flag kompiliert, ich habe gerade bemerkt, dass, während ...
std::numeric_limits<long double>::max_exponent10 = 4932
... wie zu erwarten ist, wenn ein lange Doppel tatsächlich auf einen Wert mit Exponenten größer als 308 festgelegt ist, wird es Inf. - dh in Wirklichkeit hat es nur 64-Bit-Präzision statt 80bit
Auch ist sizeof()
lange verdoppelt zeigt 16 Bytes zu sein, was sie sein sollten.
Schließlich <limits.h>
mit gibt die gleichen Ergebnisse wie <limits>
.
Wer weiß, wo die Diskrepanz könnte sein?
long double x = 1e308, y = 1e309;
cout << std::numeric_limits<long double>::max_exponent10 << endl;
cout << x << '\t' << y << endl;
cout << sizeof(x) << endl;
gibt
4932
1e + 308 inf
16
Lösung
Es ist, weil 1e309
ein wörtliches ist, die ein doppeltes gibt. Sie benötigen einen Langdoppel wörtlichen 1e309L
verwenden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow