Department of Computer Science | Institute of Theoretical Computer Science | CADMO

Theory of Combinatorial Algorithms

Prof. Emo Welzl and Prof. Bernd Gärtner

// Programm: convert.C // Beispiele fuer implizite und explizite Konversion // von elementaren Zahlentypen #include #include #include int main() { const int imax = std::numeric_limits::max(); const unsigned int umax = std::numeric_limits::max(); const float fmax = std::numeric_limits::max(); const double dmax = std::numeric_limits::max(); // int -> unsigned int; Addieren von 2^b im negativen Fall // --------------------------------------------------------- unsigned int i1 = -1; // Warnung, obwohl wohldefiniert i1 = (unsigned int)(-1); // explizite Konversion, keine Warnung assert(i1 == umax); // unsigned int -> int; undefiniert, falls zu gross // ------------------------------------------------ int i2 = umax; // leider keine Warnung, obwohl undefiniert // int/unsigned int -> float/double; naechstgroessere/-kleinere Zahl // falls exaktes Ergebnis zwischen zwei repraesentierbaren Zahlen // ----------------------------------------------------------------- float i3 = imax; // Warnung, Rundungsfehler double i4 = imax; // Warnung, obwohl exakt assert(int(i4) == imax); std::cout << "i3-i4: " << i3 - i4 << std::endl; // == 1 (aufgerundet) float i5 = imax + 2u; // Warnung, Rundungsfehler double i6 = imax + 2u; // Warnung, obwohl exakt assert((unsigned int)(i6) == imax + 2u); std::cout << "i5-i6: " << i5 - i6 << std::endl; // == -1 (abgerundet) // float/double -> int/unsigned int: Runden gegen Null // --------------------------------------------------- int i7 = 2.0f; // Warnung, obwohl kein Rundungsfehler assert (i7 == 2); int i8 = -2.5; // Warnung, Rundungsfehler assert (i8 == -2); // double -> float; naechstgroessere/-kleinere Zahl, falls // exaktes Ergebnis zwischen zwei repraesentierbaren Zahlen // (falsch definiert in VL vom 2.11.!) // ------------------------------------------------------ float i9 = i4; // keine Warnung, obwohl Rundungsfehler std::cout << "i9-i4: " << i9 - i4 << std::endl; // 1 (aufgerundet) float i10 = i6; // keine Warnung, obwohl Rundungsfehler std::cout << "i10-i6: " << i10 - i6 << std::endl; // -1 (abgerundet) return 0; }