c++ - Why do I get: -9223372036854775808 -
#include <iostream> #include <sstream> #include <numeric> #include <math.h> using namespace std; int64_t splitadd(int64_t value) { ostringstream intstream; intstream << value; string intstring(intstream.str()); return accumulate(intstring.begin(), intstring.end(), 0) - (intstring.size() * int64_t('0')); } int main(int argc, char *argv[]) { int64_t maxpower = 50; int64_t results[maxpower]; (int64_t tuple = 0; tuple <= maxpower; tuple++) { for(int64_t power = 0; power <= maxpower; power++) { int64_t value = pow(tuple, power); while (value > 9) { value = splitadd(value); } results[power] = value; } cout << tuple << endl; (int = 0; < maxpower; i++) { cout << results[i] << ','; } cout << endl; } } after while, value: -9223372036854775808 repeatedly. i'm running in code runner 2 also, not sure if make difference.
the 1 glaring error this:
int64_t maxpower = 50; int64_t results[maxpower]; // <-- not legal, let's pretend //... (int64_t power = 0; power <= maxpower; // <-- @ loop constraints power++) { //.... } results[power] = value; // <-- buffer overrun since maxpower 50, accessing element that's out of bounds. undefined behavior
also, make code legal c++, either declare array of 50:
int64_t results[50]; or declare std::vector<int64_t>.
when , use at() instead of [], better view of how program breaks. see the live example using std::vector here.
as "odd number", getting numeric overflow here:
int64_t value = pow(tuple, power); if tuple 3, , power 41, value overflows int64_t type.
maybe need use arbitrary precision library (one preferably has overloaded requisite mathematical operators) or write own, instead of using "regular" c++ types. won't or shouldn't overflow.
Comments
Post a Comment