Хорошо, на этот раз у меня действительно странная ошибка, которая не всегда появляется. Вот функция, которая на самом деле содержит проблемы. Все, что он делает, — это буквальное суммирование элементов вектора. Это работает в большинстве случаев, но в некоторых случаях это становится очень проблематичным.
int sumvec(vect v) {
int i = 0;
int sum = 0;
int l = v.length();
std::cout << "Sum of vector " << v.tostring(3) << std::endl;
for (; i < l; i++) {
sum += v[i];
std::cout << v[i] << " " << sum << " ";
};
std::cout << std::endl;
return sum;
}
Вот vect
определяется с помощью typedef alglib::real_1d_array vect;
, ОК, так что я получу? Ха ..
Sum of vector [1.000,1.000,0.000,1.000,1.000,1.000]
1 0 1 0 0 0 1 0 1 0 1 1
Какие?!!!!!
Поскольку ваша переменная суммы является целым числом, вы не можете получить ожидаемые результаты при суммировании элементов в вашем векторе, которые не являются целыми числами.
Если ваши элементы имеют значение 0.999999999
скорее, чем 1.00000
затем печать их может быть округлена до 1.00000
но когда вы добавляете их к целому числу, значение будет усечено до 0.
Судя по предоставленному выводу все ваши значения меньше 1
кроме последнего, который больше или равен 1.
Есть 2 возможных решения:
sum
быть float
или же double
,sum += static_cast<int>(round( v[i] ));
Обратите внимание, что ваш компилятор, вероятно, предупреждал об усечении двойного до целого. Обратите внимание на предупреждения компилятора, они часто указывают на ошибку.
Как прокомментировано, используйте double для хранения суммы, если вы работаете с целыми числами с плавающей запятой. использование целого числа приведет к тому, что переменная будет неявно приведена к типу int, который просто вырезает мантиссу:
0.9999998 -> 0
В зависимости от cout :: precision 0,99999 будет напечатано как 1,0000 (округлено) или без std :: fixed так же, как 1, что, вероятно, происходит в вашем примере.
double a = 0.999;
std::cout.precision(2);
std::cout << a << std::endl; /* This prints 1 */
std::cout << std::fixed;
std::cout << a << endl; /* This prints 1.00 */