2016-11-17 2 views
-1

Betrachten wir den folgenden Code:Korrekte Initialisierung eines Double mit einem Bruchteil?

double foo; 
foo = 1/35; 

Will foo dann gleich 0.02857142857 (etwa 1/35 als dezimal) oder 0 (Integer-Division)? Ist dieser Code portierbar, mit anderen Worten, ist es ein definiertes, garantiertes Verhalten, das bei der Zuweisung von etwas wie 1/35 zu einem Double eine Gleitkommadivision durchführt?

+0

es wird eine Null als ganze Zahl produzieren ... Sie Ints und denom sind Dividieren biiger als Zähler –

+1

„Wird dann gleich foo ...“ Kannst du nicht das testen? – juanchopanza

+0

Das Ergebnis ist 0. Sie müssen einen der Operanden zum Verdoppeln umwandeln. –

Antwort

0

Ihr Code macht eine ganzzahlige Division (die rechte Hand davon). Um sicherzustellen, dass Sie eine richtige doppelte Division machen, muss der Dividend und Divisor ein Double sein.

Sie können das Problem beheben mit:

foo = 1d/35; 
+1

wäre 'foo = 1.0/35' eine gültige Alternative? –

+1

@space_voyager ist es in C# (Console.WriteLine (1.0.GetType(). ToString()) Ausgänge doppelt), so nehme ich an, es würde in C++ auch. Ich würde mit dem Suffix "d" bleiben, wenn Portabilität ein Anliegen ist. –

+1

die Frage ist speziell über C++. Imho, der sich auf c oder andere Sprachen bezieht, ist irreführend zu denken, "was in C funktioniert, muss in C++ funktionieren" und das ist im Allgemeinen nicht wahr – user463035818

Verwandte Themen