İçgüdünüz temelde doğrudur, artan düzende (büyüklükte) sıralama genellikle işleri biraz iyileştirir. Tek duyarlıklı (32 bit) kayan sayılar eklediğimiz durumu düşünün ve 1 / (1 milyar) 'a eşit 1 milyar değer ve 1'e eşit bir değer vardır. 1 önce gelirse, toplam gelir 1 + (1/1 milyar) 1 olduğundan hassasiyet kaybı nedeniyle 1'e kadar. Her eklemenin toplam üzerinde hiçbir etkisi yoktur.
Küçük değerler önce gelirse, en azından toplamları bir şeye dönüşürler, ancak o zaman bile 2 ^ 30 tane var, oysa 2 ^ 25 ya da öylesine sonra, her birinin ayrı ayrı toplamı etkilemediği duruma geri döndüm. artık. Bu yüzden hala daha fazla numaraya ihtiyacım olacak.
Bu uç bir durumdur, ancak genel olarak benzer büyüklükte iki değer eklemek, çok farklı büyüklükte iki değer eklemekten daha doğrudur, çünkü bu şekilde daha küçük değerde daha az kesinlik bitini "atarsınız". Sayıları sıralayarak, benzer büyüklükteki değerleri bir arada gruplandırırsınız ve bunları artan sırada ekleyerek, küçük değerlere kümülatif olarak büyük sayıların büyüklüğüne ulaşma "şansı" verirsiniz.
Yine de, negatif sayılar söz konusuysa, bu yaklaşımı "alt etmek" kolaydır. Toplamak için üç değer düşünün {1, -1, 1 billionth}
. Aritmetik olarak doğru toplam 1 billionth
, ancak ilk toplamam küçük bir değeri içeriyorsa, o zaman son toplamım 0 olacaktır. 6 olası emirden sadece 2'si "doğru" - {1, -1, 1 billionth}
ve {-1, 1, 1 billionth}
. 6 siparişin tümü, girdideki en büyük büyüklük değeri ölçeğinde (% 0.0000001 dışarı) doğru sonuçlar verir, ancak bunların 4'ü için sonuç, gerçek çözüm ölçeğinde yanlıştır (% 100 dışarı). Çözdüğünüz belirli sorun, size eski sorunun yeterince iyi olup olmadığını söyleyecektir.
Aslında, sıralı sırayla eklemekten çok daha fazla numara oynayabilirsiniz. Çok sayıda çok küçük değeriniz, orta sayıda orta değeriniz ve az sayıda büyük değeriniz varsa, o zaman önce tüm küçük olanları toplamak, sonra orta olanları ayrı ayrı toplamak, bu iki toplamı eklemek en doğru olabilir. sonra büyük olanları ekleyin. Kayan nokta eklemelerinin en doğru kombinasyonunu bulmak hiç de önemsiz değil, ancak gerçekten kötü durumlarla başa çıkmak için, farklı büyüklüklerde bir dizi toplamları tutabilir, her yeni değeri toplama büyüklüğüne en iyi uyan toplama ekleyebilir, ve bir değişen toplam, büyüklüğü için çok büyük olmaya başladığında, onu bir sonraki toplama ekleyin ve yeni bir toplam başlatın. Mantıksal olarak en uç noktaya bakıldığında, bu işlem, toplamı rastgele hassasiyetli bir türde gerçekleştirmeye eşdeğerdir (yani, d yapın). Ancak, artan veya azalan büyüklük sırasına göre eklemenin basit seçimi göz önüne alındığında, artan daha iyi bir seçimdir.
Gerçek dünya programlamayla bir ilgisi vardır, çünkü kazara her biri ayrı ayrı etkilenemeyecek kadar küçük olan çok sayıda değerden oluşan "ağır" bir kuyruğu keserseniz, hesaplamanızın çok kötü bir şekilde yanlış gidebileceği bazı durumlar vardır. toplam veya tek tek toplamın son birkaç bitini etkileyen çok sayıda küçük değerden çok fazla kesinlik atarsanız. Kuyruğun ihmal edilebilir olduğu durumlarda, muhtemelen umursamıyorsunuzdur. Örneğin, ilk etapta yalnızca az sayıda değeri bir araya ekliyorsanız ve toplamın yalnızca birkaç önemli rakamını kullanıyorsanız.