Kayan Noktalı Sayılar Gerçek Değil

Kayan noktalı sayıları, Pascal ve Fortran gibi bazı programlama dillerinde gerçek olarak adlandırılsalar da, matematiksel anlamda "gerçek sayılar" değildir. Gerçek sayılar sonsuz kesinliğe sahiptir ve bu nedenle süreklidir ve kayıpsızdır; kayan noktalı sayıların kesinliği sınırlıdır, bu nedenle sonludurlar ve "kötü davranışlı" tam sayılara benzerler çünkü aralıkları boyunca eşit aralıklarla dağılmazlar.

Örneklemek için, 32 bitlik bir kayan değişkene (x, diyelim) 2147483647 (en büyük işaretli 32 bit tam sayı) atayın ve yazdırın. 2147483648'i göreceksiniz. Şimdi x - 64 yazdırın. Hala 2147483648. Şimdi x - 65 yazdırın ve 2147483520 elde edeceksiniz! Niye ya? Çünkü bu aralıktaki bitişik kayan noktalar arasındaki boşluk 128'dir ve kayan nokta işlemleri en yakın kayan nokta sayısına yuvarlanır.

IEEE kayan nokta sayıları, iki tabanlı bilimsel gösterime dayalı sabit kesinlikli sayılardır: 1.d1d2...dp-1</ sub> × 2e, burada p kesinliktir (float için 24, double için 53). Ardışık iki sayı arasındaki boşluk 21-p+e'tır, bu da ε|x| ile güvenli bir şekilde tahmin edilebilir; burada ε makine epsilonudur (21-p</ ss>).

Bir kayan noktalı sayının çevresindeki boşluğu bilmek, klasik sayısal hatalardan kaçınmanıza yardımcı olabilir. Örneğin, bir denklemin kökünü aramak gibi yinelemeli bir hesaplama yapıyorsanız, cevabın komşuluğunda sayı sisteminin verebileceğinden daha fazla kesinlik istemenin bir anlamı yoktur. İstediğiniz toleransın buradaki boşluktan daha küçük olmadığından emin olun; yoksa sonsuza kadar döngü yaparsın.

Kayan noktalı sayıları, gerçek sayıların yaklaşık değerleri olduğundan, kaçınılmaz olarak küçük bir hata vardır. Yuvarlama adı verilen bu hata şaşırtıcı sonuçlara yol açabilir. Örneğin, neredeyse eşit sayıları çıkardığınızda, en anlamlı rakamlar birbirini yok eder, bu nedenle en az anlamlı olan rakam (yuvarlama hatasının bulunduğu yer) kayan nokta sonucunda en önemli konuma yükseltilir ve esasen herhangi birini kirletir. diğer ilgili hesaplamalar (bulaşma olarak bilinen bir olgu). Böyle bir felaket iptalini önlemek için algoritmalarınıza yakından bakmanız gerekir. Örneklemek için, x2 - 100000x + 1 = 0 denklemini ikinci dereceden formülle çözmeyi düşünün. -b + sqrt(b2 - 4) ifadesindeki işlenenlerin büyüklükleri hemen hemen eşit olduğundan, bunun yerine r1 = -b + sqrt(b2 - 4) kökünü hesaplayabilir ve ardından r2 = 1/r1 elde edebilirsiniz, çünkü herhangi bir ikinci dereceden ax2 + bx + c = 0 denklemi için kökler r1r2 = c/a'ı sağlar.

Bulaşma daha da ince şekillerde ortaya çıkabilir. Bir kitaplığın ex1 + x + x2/2 + x3/3! + ... formülüyle basitçe hesapladığını varsayalım. Bu, pozitif x için iyi çalışır, ancak x büyük bir negatif sayı olduğunda ne olduğunu düşünün. Çift güçlü terimler büyük pozitif sayılarla sonuçlanır ve tek güçlü büyüklüklerin çıkarılması sonucu bile etkilemez. Buradaki sorun, büyük, pozitif terimlerdeki yuvarlamanın, gerçek cevaptan çok daha önemli bir rakam konumunda olmasıdır. Cevap pozitif sonsuzluğa doğru sapıyor! Buradaki çözüm de basittir: negatif x için ex = 1/e|x|'u hesaplayın.

Finansal uygulamalar için kayan noktalı sayıları kullanmamanız gerektiğini söylemeye gerek yok, Python ve C# gibi dillerdeki ondalık sınıflar bunun içindir. Kayan noktalı sayıları verimli bilimsel hesaplama için tasarlanmıştır. Ancak doğruluk olmadan verimlilik değersizdir, bu nedenle yuvarlama hatalarının kaynağını unutmayın ve buna göre kodlayın!

Chuck Allison Tarafından

Last updated