2016-03-23 12 views
1

Ich versuche, etwas auf meinem Mac OS X XCode 7.2.1 -unsigned long long unerwartetes Verhalten in Xcode Klirren Compiler

#define uint64 unsigned long long 

int N = 100000; 
uint64 value = (pow(N, 4) + 2 * pow(N, 3) + 3 * pow(N, 2) + 2 * N)/4; 
cout << "value: " << value << endl; // this is equivalent to ULLONG_MAX (18446744073709551615) 
cout << "ULLONG_MAX: " << ULLONG_MAX << endl; 

So ist der Ausgang sein soll -

value: 18446744073709551615 
ULLONG_MAX: 18446744073709551615 

Aber die Ausgabe ist -

value: 0 
ULLONG_MAX: 18446744073709551615 

Auch unten Änderungen machten keinen Unterschied.

uint64 N = 100000ull; 
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N)/4ull; 

Lauf gcc --version Befehl auf meinem Gerät liefert -

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 7.0.2 (clang-700.1.81) 
Target: x86_64-apple-darwin15.0.0 
Thread model: posix 

ich oben Code versucht in Hackerrank g ++ 4.9.2 Compiler und die Ausgabe korrekt war.

Was passiert unter der Haube? Ist es Clang oder mein Betriebssystem (Mac OS X 10.11)?

+2

Wenn Sie stattdessen 'long double' zuweisen, sehen Sie, dass das Ergebnis _not_' ULLONG_MAX' ist. Stattdessen würde es überlaufen. 'langer doppelter Wert = pow (N, 4.0L) + 2.0L * pow (N, 3.0L) + 3.0L * pow (N, 2.0L) + 2.0L * N)/4.0L;' – paddy

+0

Danke :) 'long double' kann mehr Daten enthalten, was sicherlich hilfreich ist, um zu überprüfen, ob in diesem Fall ein Überlauf auftritt. –

Antwort

4

Dies wird durch Überlauf verursacht. Ihre Gleichung gibt zurück: 25000500007500050000, die für eine unsigned lange lange zu groß ist.

Es scheint wie clang behandelt dies etwas anders als g ++. Ich habe einen kleinen Test gemacht, um zu sehen, was das Ergebnis nach der Besetzung geworden ist.

Siehe: Clang giving random values während g++std::numeric_limits<std::uint64_t>::max() zurückgibt.


Sollten müssen Sie diese Nummer (in einem Datentyp) Ich persönlich würde empfehlen eine Bibliothek zu finden, die beliebig lange Zahlen (gmp oder vergleichbar) unterstützt.

+1

Vielen Dank. Ich dachte fast dasselbe wie du, nur glücklich, um sicher zu sein :) Speziell für mein Problem hat der Umgang mit 'unsigned long long 'alle Testfälle bestanden, so dass ich mich nicht mit großen Integer oder ähnlichen Dingen beschäftigen muss Zeit. –

Verwandte Themen