float 배열의 제곱의 합을 계산하려고합니다.float의 제곱합의 반올림 오류를 줄입니다.
반올림 오류를 줄이는 방법은 무엇입니까?
실제 프로그램의 내부 루프에서 약 5,000,000 개의 수레를 합치려고합니다.
Test.cpp에 :
가#include <iostream>
#include <stdint.h>
template <typename Sum, typename Element>
Sum sum(const size_t st, const size_t en) {
Sum s = 0;
for (size_t i = st; i < en; ++ i) {
s += Element(i)*Element(i);
}
return s;
}
int main() {
size_t size = 100000;
std::cout << "double, float: "
<< sum<double, float>(0,size) << "\n";
std::cout << "int, int: "
<< sum<int, int>(0,size) << "\n";
}
출력 : 플로트의 포맷은 예컨대 IEEE로서 알려진 경우
가double, float: 3.33328e+14
int, int: 216474736
은 집에 돌아온 후 https://en.wikipedia.org/wiki/Pairwise_summation 및 https://en.wikipedia.org/wiki/Kahan_summation_algorithm에 대해 자세히 읽습니다. –
정렬하고 가장 작게 시작하십시오. – EJP
'size_t size = 100000;'은 이제'int'를 위해 너무 많습니다. – LogicStuff