Dies ist ein wirklich unangenehmes kleines Problem, das drei (!) Ursachen hat.
Erstens gibt es ein Problem, dass Fließkommaarithmetik ist ungefähr. Wenn der Compiler eine pow
Funktion wählt, die float oder double zurückgibt, dann ist 4 ** 31 so groß, dass 5 weniger als 1ULP (Einheit mit der geringsten Genauigkeit) ist, also fügt es nichts hinzu (mit anderen Worten, 4,0 ** 31 + 5) == 4.0 ** 31). Multiplikation mit -2 kann ohne Verlust durchgeführt werden, und das Ergebnis kann in einem long long
ohne Verlust als die falsche Antwort gespeichert werden: -9.223.372.036.854.775.808.
Zweitens kann ein Standard-Header andere Standard-Header enthalten, ist aber nicht erforderlich. Offensichtlich enthält die Visual Studio-Version von <iostream>
<math.h>
(die pow
im globalen Namespace deklariert), aber Code :: Blocks 'Version nicht.
Drittens der pow
Funktion des OP ist nicht ausgewählt, weil er Argumente geht 4
und 31
, die int
beide vom Typ sind, und die deklarierte Funktion Argumente vom Typ unsigned
. Seit C++ 11 gibt es viele Überladungen (oder eine Funktionsschablone) von std::pow
. Diese geben alle float
oder double
zurück (es sei denn, eines der Argumente ist vom Typ long double
- was hier nicht zutrifft).
Also eine Überladung von std::pow
wird eine bessere Übereinstimmung sein ... mit einem doppelten Rückgabewerte, und wir erhalten Gleitkomma-Rundung.
Moral der Geschichte: Schreiben Sie nicht Funktionen mit dem gleichen Namen wie Standard-Bibliothek Funktionen, es sei denn Sie wirklich wissen, was Sie tun!
Kommentare sind nicht für längere Diskussionen; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/130291/discussion-on-question-by-peter-long-long-value-in-visual-studio). –