Warum werden Gleitkommawerte wie 3.14 in MSVC standardmäßig als doppelt betrachtet?

8

Warum muss ich 3,14f anstelle von 3,14 setzen, um alle diese Warnungen zu deaktivieren? Gibt es einen schlüssigen Grund dafür?

    
jokoon 04.12.2010, 13:42
quelle

5 Antworten

17

Das hat der C ++ (und C) Standard entschieden. Fließkommaliterale sind vom Typ double, und wenn Sie sie als Floats benötigen, suffi- zieren Sie sie mit einem f . Es scheint keinen genau angegebenen Grund dafür zu geben, aber ich denke, es ist a) Aus Kompatibilitätsgründen zu C und b) Ein Kompromiss zwischen Präzision und Speicher.

  

2.13.3 Fließende Literale Der Typ   eines floating literal ist doppelt, es sei denn   explizit durch ein Suffix angegeben. Das       Suffixe f und F spezifizieren float, die Suffixe l und L spezifizieren long double.   Wenn der skalierte Wert nicht in der   Bereich von       darstellbare Werte für seinen Typ, das Programm ist schlecht gebildet.

    
nos 04.12.2010, 13:44
quelle
5

C und C ++ bevorzugen Double, um auf verschiedene Arten zu floaten. Wie Sie bemerkt haben, sind Bruchliterale doppelt vorhanden, es sei denn, es wurden explizit Floats erstellt. Floats können auch nicht in varargs übergeben werden, sie werden immer zu double hochgestuft (in gleicher Weise werden char und short in varargs zu int hochgestuft).

Es ist wahrscheinlich besser, sich float als eine vertraglich vereinbarte double vorzustellen, anstatt als double eine erweiterte float . Das heißt, double ist der bevorzugte Gleitkommatyp, und float wird verwendet, wenn für einen bestimmten Fall eine kleinere Version von double erforderlich ist. Das ist der nächstliegende, den ich aus einem zusammenhängenden Grund kenne, und dann macht die Regel Sinn, selbst wenn Sie gerade in dem Fall sind, in dem Sie eine kleinere Version benötigen.

    
Steve Jessop 04.12.2010 14:17
quelle
1

Dies ist nicht MSVC eigen, es wird vom Sprachstandard verlangt.

Ich würde vorschlagen, dass es nicht sinnvoll ist, die Genauigkeit zu reduzieren, es sei denn, dies wird ausdrücklich angefordert, so dass der Standardwert doppelt ist.

Die sechs signifikanten Stellen der Genauigkeit, die ein Float mit einfacher Genauigkeit liefert, reichen selten für den allgemeinen Gebrauch aus, und sicherlich würde ein moderner Desktop-Prozessor als handcodierte Optimierung verwendet werden, wo der Schreiber festgestellt hat, dass sie ausreichend und notwendig ist; Daher ist es sinnvoll, dass ein expliziter sichtbarer Marker erforderlich ist, um ein Literal mit einfacher Genauigkeit anzugeben.

    
Clifford 04.12.2010 14:25
quelle
0

Dies ist wahrscheinlich ein Standard in der C-Welt. Double wird bevorzugt, da es genauer ist und Sie wahrscheinlich keine Leistungsunterschiede sehen werden. Lesen Sie diesen Beitrag .

    
darioo 04.12.2010 13:46
quelle
0

Weil double 3.14 viel besser als float ist, vielleicht? Hier sind die genauen Werte:

3.140000000000000124344978758017532527446746826171875 ( double )

3.1400001049041748046875 ( float )

    
fredoverflow 04.12.2010 17:16
quelle