La façon tout à fait optimale consiste à utiliser une file d'attente de priorité, de la manière suivante:
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();
(Ce code suppose que les chiffres sont positifs, généralement la file d'attente doivent être commandés par la valeur absolue)
Explication: à partir d'une liste de nombres, pour les additionner aussi précisément que possible, vous devriez vous efforcer de rapprocher les chiffres, ti éliminer la différence entre les petits et les grands. C'est pourquoi vous voulez ajouter les deux plus petits nombres, augmentant ainsi la valeur minimale de la liste, diminuant la différence entre le minimum et le maximum dans la liste et réduisant la taille du problème par 1.
Malheureusement je n'ai aucune idée de comment cela peut être vectorisé, sachant que vous utilisez OpenCL. Mais je suis presque sûr que cela peut être. Vous pourriez jeter un coup d'oeil sur le livre sur les algorithmes vectoriels, il est surprenant de voir à quel point ils sont puissants: Vector Models for Data-Parallel Computing
pourquoi pensez-vous que le résultat soit inférieur à 1? Je suis confus! – lexu
Je pense qu'il dit que * une fois * le résultat passe 1.0 les problèmes commencent à se poser. * Quels * problèmes je ne sais pas, mais c'est comme ça que je l'ai pris. –
En Python, utilisez 'math.fsum' (http://docs.python.org/library/math.html#math.fsum). – kennytm