2016-11-24 3 views
1

Ich habe nicht wirklich viel darüber herausfinden können. Der Compiler scheint sich jedoch nicht zu beschweren, wenn ich eine Variable des Typs float mit einer double z.C++ Kann ich eine Variable vom Typ float mit einem double initialisieren?

double a = 1.0; 
float b = a; 

Es funktioniert gut, aber ich bin immer noch neugierig, ob es OK ist, und/oder ist es sicher?

(Ich bin auf einem 32-Bit-Windows-System)

+0

@coddding Welche Definition von "sicher" sollte in den Antworten angenommen werden? – njuffa

Antwort

1

Die Größe der erstellten Variablen ist unterschiedlich. "float = 4 Bytes" und "double = 8 Bytes". Was hier wichtig ist, ist also, dass der Wertebereich für beide Typen unterschiedlich ist. Wenn Sie kleine Werte als 1.0 verwenden, sollte dies den Workflow nicht beeinflussen.

2

4,8 Gleitpunkt Konvertierungen

A prvalue von Gleitkomma-Typ kann auf eine prvalue eines anderen schwimmenden umgewandelt werden Punkttyp Wenn der Quellwert im Zieltyp genau dargestellt werden kann, ist das Ergebnis der Konvertierung die genaue Darstellung. Wenn der Quellwert zwischen zwei benachbarten Zielwerten liegt, ist das Ergebnis der Konvertierung eine implementierungsdefinierte Auswahl eines dieser Werte. Andernfalls ist das Verhalten nicht definiert.

+0

Die letzte Klausel (undefiniertes Verhalten) gilt für Quellwerte außerhalb des darstellbaren Bereichs des Zielformats. Es ist also falsch zu sagen, dass "allgemein" undefiniertes Verhalten resultiert. Für den speziellen Fall der "Doppel" - "Float" -Umsetzung gilt die erste Klausel für Quelldaten wie "5.0"; der zweite Abschnitt gilt für Quelldaten wie '3.14159265358979323'; Der letzte Abschnitt gilt für Quelldaten wie '1e308'. – njuffa

+2

Im Allgemeinen ist es ** nicht ** undefiniertes Verhalten. –

+0

@njuffa Die Frage ist "_Can I Initialisiere eine Variable vom Typ float mit einem Double? _". "1" ist nur ein Beispielwert, "1e308" könnte ein anderes Beispiel sein. Ich bin kein Muttersprachler, aber was ich meine, ist "im allgemeinen Fall, d. H. Ohne Annahmen über Darstellungen von" float "und" double "und ohne Annahmen konkreter Werte ist es UB_". – AlexD

1

Wie der Name schon andeutet, hat ein Double die doppelte Genauigkeit von float [1]. Im Allgemeinen hat eine doppelte 15 Dezimalstellen Präzision, während Schwimmer 7.

Hier hat, wie die Anzahl der Ziffern berechnet:

double has 52 mantissa bits + 1 hidden bit: log(253)÷log(10) = 15.95 digits 

float has 23 mantissa bits + 1 hidden bit: log(224)÷log(10) = 7.22 digits 

Vielleicht wirst du Präzision verlieren, es zu tun.

Verwandte Themen