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

War es hilfreich?

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
scroll top