Naluri Anda pada dasarnya benar, mengurutkan dalam urutan menaik (besarnya) biasanya sedikit meningkatkan banyak hal. Pertimbangkan kasus di mana kita menambahkan pelampung presisi tunggal (32 bit), dan ada 1 miliar nilai yang sama dengan 1 / (1 miliar), dan satu nilai sama dengan 1. Jika 1 datang lebih dulu, maka jumlahnya akan datang menjadi 1, karena 1 + (1/1 miliar) adalah 1 karena hilangnya presisi. Setiap penambahan tidak berpengaruh sama sekali pada total.
Jika nilai kecil datang lebih dulu, mereka setidaknya akan berjumlah sesuatu, meskipun demikian saya memiliki 2 ^ 30 dari mereka, sedangkan setelah 2 ^ 25 atau lebih saya kembali ke situasi di mana masing-masing secara individual tidak mempengaruhi total lagi. Jadi saya masih membutuhkan lebih banyak trik.
Itu kasus yang ekstrem, tetapi secara umum menambahkan dua nilai dengan besaran yang sama lebih akurat daripada menambahkan dua nilai dengan besaran yang sangat berbeda, karena Anda "membuang" lebih sedikit bit presisi dalam nilai yang lebih kecil dengan cara itu. Dengan mengurutkan angka-angka, Anda mengelompokkan nilai-nilai yang besarnya sama, dan dengan menambahkannya dalam urutan menaik Anda memberi nilai-nilai kecil sebuah "peluang" untuk secara kumulatif mencapai besaran angka yang lebih besar.
Namun, jika angka negatif terlibat, mudah untuk "mengecoh" pendekatan ini. Pertimbangkan tiga nilai untuk dijumlahkan {1, -1, 1 billionth}
,. Jumlah yang benar secara aritmatika adalah 1 billionth
, tetapi jika penjumlahan pertama saya melibatkan nilai kecil maka jumlah akhir saya adalah 0. Dari 6 kemungkinan pesanan, hanya 2 yang "benar" - {1, -1, 1 billionth}
dan{-1, 1, 1 billionth}
. Semua 6 pesanan memberikan hasil yang akurat pada skala nilai besaran terbesar di masukan (0,0000001% keluar), tetapi untuk 4 dari mereka hasilnya tidak akurat pada skala solusi sebenarnya (100% keluar). Masalah khusus yang Anda selesaikan akan memberi tahu Anda apakah yang pertama cukup baik atau tidak.
Faktanya, Anda dapat memainkan lebih banyak trik daripada hanya menambahkannya dalam urutan yang diurutkan. Jika Anda memiliki banyak nilai yang sangat kecil, angka tengah dari nilai sedang, dan sejumlah kecil nilai besar, maka mungkin paling akurat untuk pertama-tama menjumlahkan semua yang kecil, lalu secara terpisah menjumlahkan yang sedang, tambahkan kedua total tersebut bersama-sama lalu tambahkan yang besar. Sama sekali tidak sepele untuk menemukan kombinasi paling akurat dari penambahan floating-point, tetapi untuk mengatasi kasus yang sangat buruk, Anda dapat menyimpan seluruh rangkaian total yang berjalan pada besaran yang berbeda, tambahkan setiap nilai baru ke total yang paling sesuai dengan besarnya, dan saat total berjalan mulai terlalu besar untuk besarannya, tambahkan ke total berikutnya dan mulai yang baru. Diambil ke ekstrem logisnya, proses ini setara dengan melakukan penjumlahan dalam tipe presisi sewenang-wenang (jadi Anda ' d melakukan itu). Tetapi mengingat pilihan sederhana untuk menambahkan dalam urutan naik atau turun, naik adalah taruhan yang lebih baik.
Ini memang memiliki beberapa hubungan dengan pemrograman dunia nyata, karena ada beberapa kasus di mana perhitungan Anda bisa menjadi sangat salah jika Anda secara tidak sengaja memotong ekor "berat" yang terdiri dari sejumlah besar nilai yang masing-masing terlalu kecil untuk mempengaruhi satu per satu. jumlahnya, atau jika Anda membuang terlalu banyak presisi dari banyak nilai kecil yang secara individual hanya memengaruhi beberapa bit terakhir dari jumlah tersebut. Dalam kasus di mana ekor dapat diabaikan, Anda mungkin tidak peduli. Misalnya jika Anda hanya menjumlahkan sejumlah kecil nilai di tempat pertama dan Anda hanya menggunakan beberapa angka penting dari jumlah tersebut.