2015-05-27 5 views
8

Von diesen anderen QUESTION sie darüber sprechen, wie Bjarne Stroustrup sagte, dass nur als integrale Datentypen enger als ein int (z short) zu einem int gefördert werden, werden float s zu einem double gefördert. Im Gegensatz zur Erweiterung von Integralen, die schmaler sind als ein int, Gleitkomma-Förderung passiert nicht auf die gleiche Weise, sondern stattdessen an anderer Stelle.Nein wirklich, wann kommt es tatsächlich zur Gleitkomma-Förderung?

Ich weiß, dass, wenn Sie float + double die float berechnen wäre, würde zu einem double vor dem binären Operator umgewandelt werden (+) angewendet wird. Dies ist jedoch nicht Gleitkomma-Förderung nach Learncpp.com. Dies ist übliche arithmetische Umwandlung.

Wann findet tatsächlich eine Gleitkomma-Förderung statt?

+1

Lesen Sie durch die Kommentare und Antworten, die Sie sehen, das Bjarne Buch ist ein Fehler. –

+0

mögliches Duplikat von [Gleitkomma-Promotion: stroustrup vs Compiler - wer hat Recht?] (Http://stackoverflow.com/questions/17215484/floating-point-promotion-stroustrup-vs-compiler-who-is-right) –

+0

@RichardHodges Ich habe die Kommentare gelesen. Selbst wenn dieser kleine Auszug aus dem Buch genommen wurde, sagt mir das nicht, ob die Fließkomma-Förderung aus der Sprache genommen wurde. Ich habe immer noch keine Ahnung, wann eine Floating Point-Promotion stattfinden kann. – Bryan

Antwort

13

Es gibt so etwas wie eine "Floating-Point-Förderung" von float zu double pro [conv.fpprom].

A prvalue vom Typ float kann einen prvalue von double Typ umgewandelt werden. Der Wert ist unverändert.

Diese Konvertierung wird Fließkomma-Förderung genannt.

Die Antworten auf die verknüpfte Frage sind korrekt. Diese Heraufstufung sollte nicht automatisch beim Hinzufügen von zwei float s erfolgen, da die üblichen arithmetischen Konvertierungen keine Gleitkommaoperanden fördern.

Gleitpunkt Förderung ist auftreten, wenn ein float als Operand zu einer Ellipse verläuft, wie in printf.Deshalb druckt der Formatbezeichner %f entweder float oder double: Wenn Sie eine float übergeben, erhält die Funktion tatsächlich eine double, das Ergebnis der Förderung.

Die Existenz der Förderung Gleitkomma- auch in Überladungsauflösung von Bedeutung ist, weil integral aktionen und Gleitkomma aktionen besser als integrale implizite Konvertierung Rang haben Konvertierungen, Gleitkomma- Konvertierungen und Floating-integral Umrechnungen.

Beispiel 1:

void f(double); 
void f(long double); 
f(0.0f); 

Dies erfordert void f(double) da die Förderung zu double ist besser als die Umstellung auf long double. Betrachten Sie im Gegensatz dazu dieses vielleicht überraschende Beispiel 2:

void f(long double); 
void f(int); 
f(0.0f); 

Dies ist mehrdeutig. Die Umrechnung von float zu long double ist nicht besser als die Umrechnung von float zu int, da es sich bei beiden nicht um Promotionen handelt.

Beispiel 3:

struct S { 
    operator float(); 
    operator int(); 
}; 
double d = S(); 

Dies erfordert operator float und dann fördert den resultierenden float Wert doubled zu initialisieren.

+0

Ihre Antwort ist so detailliert und hat tolle Beispiele. Ich bekomme jetzt die Fließkomma-Promotion komplett. Ich danke dir sehr! – Bryan

6

Der primäre (vielleicht einzige) Zeitpunkt, zu dem Gleitkomma-Promotions angewendet werden, ist, wenn ein Argument an eine Variadic-Funktion übergeben wird (z. B. printf).

In diesem Fall gelten die üblichen arithmetischen Konvertierungen nicht (sie dienen zum Auffinden eines gemeinsamen Typs zwischen zwei Operanden in einem Ausdruck).

Der relevante Teil des Standard ist [expr.call]/7 (zumindest von N4296):

Wenn kein Parameter für ein gegebenes Argument ist, wird das Argument in der Weise geführt dass die empfangende Funktion den Wert des Arguments durch Aufrufen von va_arg (18.10) erhalten kann.
[...]
Wenn das Argument einen Integral- oder Aufzählungstyp hat, der den Integral-Promotions (4.5) unterliegt, oder ein Gleitkommatyp, der der Gleitkomma-Heraufstufung (4.6) unterliegt, der Wert des Arguments wird vor dem Aufruf in den hochgestuften Typ konvertiert.

+0

Sprechen Sie über Typkonvertierung? Ich weiß, dass die Typumwandlung stattfindet, wenn Sie eine Gleitkommazahl an eine variadische Funktion übergeben, die einen doppelten Parameter hat. Ich glaube nicht, dass Typkonvertierung und Gleitkomma-Promotion dasselbe sind. Wenn du etwas anderes meintest, würdest du bitte etwas ausarbeiten? – Bryan

+0

Oh! Du sprichst von Ellipsen. Der Parameter könnte ein beliebiger Wert und eine beliebige Anzahl von Werten sein. So kann Floating Point Promotion stattfinden. Vielen Dank! – Bryan

Verwandte Themen