2015-05-23 2 views
0

Я писал небольшую программу для сравнения скорости между CPP и Matlab, и я заметил, что получаю неправильный ответ при работе с большими числами.C++ дает странные ответы с большими номерами (afaik not overflow)

Вот код:

#include "stdafx.h" 
#include <iostream> 
#include "time.h" 



int main() 
{  

    clock_t t = clock(); 

    long x = 1000000; 

    long sum = 0;  

    for (long i = 1;i <= x;i++) { 
     sum = sum + i; 
    } 

    t = clock() - t; 

    printf("It took %d ms, sum equals=",t); 
    std::cout << sum << std::endl; 

    return 0; 
} 

100 000 возвращает правильный ответ, но выше 1000 0000 нет. У кого-нибудь есть идея, что происходит? Я не могу представить, что проблема переполнена, потому что вовлеченные числа просто не такие большие (правильный ответ 5e9).

+0

Почему вы не используете большое количество для больших вычислений? используйте long long или int64, посмотрите http://en.cppreference.com/w/cpp/types/integer – ahmedsafan86

+1

Используйте ['std :: numeric_limits :: max()'] (http: //en.cppreference. com/w/cpp/types/numeric_limits/max), чтобы проверить, что является самым большим 'long', которое может быть представлено в вашей системе. –

ответ

3

Проблема переполнения. 5e9 - 5'000'000'000, но наибольшее количество 32-разрядных знаковых чисел (длинных на 32-разрядных платформах и 64-разрядных Windows, 64-разрядных в 64-разрядной Linux) может содержать 2 ' 147'483'648.

+0

проклятый, идиот; неправильно прочитал эту таблицу, http://www.cplusplus.com/reference/climits/, долго думал 2^63, никогда не знал, что долгое время существует – Nimitz14

0

Я дал вашей программе пробный прогон, и он вернул правильный ответ (по сравнению с вольфрамом альфа). Поэтому в коде, который я бы сказал, нет ошибки.

EDIT: работайте на 64-битной машине, поэтому вы можете использовать 32-битный и получить переполнение, как указано в ответе выше.

Смежные вопросы