당신이 (자바) 약간의 여분의 공간을 허용 할 수있는 경우 :
float temp = new float[1000000];
float temp2 = new float[1000];
float sum = 0.0f;
for (i=0 ; i<1000000000 ; i++) temp[i/1000] += array[i];
for (i=0 ; i<1000000 ; i++) temp2[i/1000] += temp[i];
for (i=0 ; i<1000 ; i++) sum += temp2[i];
표준 분할 정복 알고리즘, 기본적으로합니다. 숫자가 임의로 흩어져있는 경우에만 작동합니다. 처음 수 십억 개가 1e-12이고 두 번째 수십억 개가 훨씬 더 큰 경우에는 작동하지 않습니다.
하지만 그 중 하나를 수행하기 전에 결과를 두 배로 누적 할 수 있습니다. 그것은 많은 도움이 될 것입니다. ;
가
PriorityQueue<Float> q = new PriorityQueue<Float>();
for(float x : list) q.add(x);
while(q.size() > 1) q.add(q.pop() + q.pop());
return q.pop();
(일반적 큐가 절대 값으로 정렬되어야이 코드 번호 양성 가정)
왜 결과가 1보다 작을 것으로 예상합니까? 나는 혼란스러워! – lexu
나는 그가 결과가 1.0으로 넘어 가면 문제가 발생하기 시작한다고 말한 것 같습니다. * 내가 알지 못하는 문제는 무엇인가? –
파이썬에서는'math.fsum' (http://docs.python.org/library/math.html#math.fsum)을 사용하십시오. – kennytm