Skip to content

Glossary

IEEE 754

Her işlemcinin arkasındaki kayan nokta standardı

By Published Updated

IEEE 754, ilk olarak 1985'te yayımlanan ve 2008 ile 2019'da güncellenen kayan noktalı aritmetik standardıdır. İkili ve ondalık kayan nokta biçimlerini, yuvarlama davranışını, istisna işlemeyi ve özel değerleri (NaN, ±Sonsuz, −0) tanımlar.

Standart çift hassasiyet biçimi, JavaScript Numbers, Python float'ları ve modern dillerdeki diğer çoğu "sayı" türünün kullandığı biçimdir:

  • Toplam 64 bit
  • 1 bit işaret
  • 11 bit üs
  • 52 bit mantis
  • ~15-17 önemli ondalık basamak hassasiyeti
  • Yaklaşık 4,9e−324 ile 1,8e+308 aralığı

Ünlü örnek: 0.1 + 0.2 === 0.3 ifadesi neredeyse her dilde false döndürür. Bunun nedeni: 0,1 ve 0,2'nin tam ikili gösterimi yoktur (tıpkı 1/3'ün tam ondalık gösterimi olmadığı gibi). Saklanan değerleri 0,1 ve 0,2'ye çok yakın ama tam olarak eşit değildir; toplama da küçük hatayı bileştirir. Sonuç 0,30000000000000004 olur.

Araçlarımız için çıkarımlar: çoğu dönüşüm ~15 ondalık basamak doğruluğundadır; bu, kabul ettiğimiz herhangi bir girdiden fazladır. Bunun önem kazandığı yer: 18 ondalıklı Wei, Number aralığını aştığından kripto para miktarları — orada hassasiyeti tam tutmak için BigInt kullanıyoruz.

Çalışılmış örnek

JavaScript'te 0.1 + 0.2 hesaplamasını düşünün. IEEE 754 ikilisinde 0.1 değişmezi aslında 0,10000000000000000555111512312578…'dir (en yakın temsil edilebilir double). 0.2 ise 0,20000000000000001110223024625157…'dir. Bunları toplayıp en yakın temsil edilebilir double'a yuvarlarsak 0,30000000000000004440892098500626… elde ederiz; bu da 0,30000000000000004 olarak görüntülenir. Matematiksel gerçek değer olan 0,3, ikili sistemde tam olarak temsil edilemez — onun gösterimi de yaklaşık 0,299999…9989…'dur. Hata son ulp'dadır (son basamaktaki birim), yaklaşık 10¹⁶'da 1. Görünür sayılar için fark yoktur; milyonlarca küçük değerin toplamında birikir: bir döngüde 0,1'i yüz kez toplayıp 10,0 ile karşılaştırmak false döndürür (sonuç 9,99999999999999822364…'tür). Uzun birikimlerde doğruluk önemli olduğunda Kahan toplamı veya telafi edilmiş toplama kullanın.

Bilinmesi gereken iki özel değer tuzağı daha: subnormal sayılar (sıfıra yakın çok küçük değerler, azaltılmış hassasiyetle) temsil edilebilir aralığı graceful underflow ile takas eder; sinyalleyen NaN'lar (sNaN), başlatılmamış bellek üzerinde tetikleme için kullanılabilir, ancak çoğu dil tüm NaN'ları sessiz NaN'lara (qNaN) eşler ve bu ayrımı kullanıcı koduna hiçbir zaman açmaz.

Ne zaman ve neden önemli

IEEE 754, kod float'ları eşitlik açısından karşılaştırdığında, pek çok küçük sayıyı topladığında veya biçimin sınırlarına yakın değerleri ele aldığında önemlidir. Klasik finansal hata, bir döngüde bir milyon kez "toplam = toplam + 0,01" hesaplayıp sonucun bilanço mutabakatını bozacak kadar küçük bir fark içerdiğini keşfetmektir. Çözüm, para için hiçbir zaman float kullanmamaktır — BigDecimal, Python'un decimal.Decimal'i, JavaScript'in decimal.js'si kullanın ya da miktarları tamsayı olarak saklayın (dolar yerine sent, bitcoin yerine satoshi, ETH yerine wei). Diğer klasik hata, neredeyse eşit iki float'ı çıkardığınızda oluşan yıkıcı iptalleme — önde gelen önemli basamaklar iptal olur, geride yalnızca alt bitlerdeki gürültü kalır. Sayısal analiz ders kitapları, bu tuzaktan kaçınan algoritmalara (örn. kararlı varyans formülü, Kahan toplamı, Welford'ın çevrimiçi algoritması) bütün bölümler ayırır. Referans: Goldberg D. — Her Bilgisayar Bilimcisinin Kayan Nokta Aritmetiği Hakkında Bilmesi Gerekenler.

Herkesin unuttuğu beş özel değer: IEEE 754, +0 ve −0'ı ayrı olarak tanımlar (eşit karşılaştırılırlar ancak bölmede farklı sonuçlar üretirler — 1/+0 +∞ iken 1/−0 −∞'dur); taşma için +Infinity ve −Infinity; 0/0 veya √−1 gibi tanımsız işlemler için NaN (Sayı Değil). NaN, kendisiyle eşit olmadığıyla ünlüdür — NaN === NaN ifadesi false'tır — bu, IEEE 754'ün hataları maskelemek yerine hesaplama boyunca yaymasının yoludur. Her modern dildeki Number.isNaN() kontrolü, açık eşitlik kontrolünün işe yaramaması nedeniyle tam olarak bu yüzden vardır.

Gerçekten tam ondalık sayıya ne zaman ihtiyaç duyarsınız — ve bunun yerine ne kullanılır: para için asla float kullanmayın. Java'nın BigDecimal'i, Python'un decimal.Decimal'i, decimal.js gibi JavaScript kütüphaneleri ve PostgreSQL'in NUMERIC türü tam ondalık aritmetik uygular. Maliyet, yerel float işlemlerinden yaklaşık 10-100 kat daha yavaştır; kullanıcıya dönük her işlem sistemi için bu kabul edilebilirdir. Yuvarlama davranışının önemli olduğu bilimsel hesaplamalar için IEEE 754'ün round-to-nearest-even (banker yuvarlama) yöntemi, kararlı birikimli toplamlar üretir; yarıya yuvarlama (round-half-up) ise yukarı yönlü sapma oluşturur. Çoğu dil bu nedenle varsayılan olarak round-half-even kullanır. Referans: IEEE 754-2019 — Kayan Nokta Aritmetiği.

Frequently asked questions

IEEE 754 nedir?
IEEE 754, neredeyse tüm işlemciler ve programlama dilleri tarafından kullanılan kayan noktalı aritmetik için uluslararası standarttır. Gerçek sayıların işaret, üs ve mantis alanları olarak ikili sistemde nasıl temsil edileceğini tanımlar.
0,1 + 0,2 çoğu dilde neden 0,3'e eşit değil?
0,1 ve 0,2, ikili kayan noktalı sistemde tam olarak temsil edilemez — en yakın temsil edilebilir değer olarak saklanırlar. İki yaklaşık değerin toplanması yuvarlama hatasını birleştirir; IEEE 754 çift hassasiyetinde 0,30000000000000004 sonucunu verir.
32 bit float ile 64 bit double arasındaki fark nedir?
32 bit float yaklaşık 7 önemli ondalık basamak hassasiyetine sahipken 64 bit double yaklaşık 15-17 basamak hassasiyetine sahiptir. Finansal ve bilimsel hesaplamalar, yuvarlama hatalarının birikmesini önlemek için tipik olarak çift hassasiyet gerektirir.
Kodda kesin ondalık aritmetiği nasıl gerçekleştiririm?
Yerel float yerine bir ondalık kütüphanesi kullanın (Python'un decimal modülü, Java'nın BigDecimal'i, SQL'in NUMERIC türü). Alternatif olarak, para birimi için tamsayı sentler üzerinden çalışın — 1,99 $ değerini 199 olarak saklayın ve yalnızca görüntülemek için ondalık dizeye dönüştürün.

Related

Published May 15, 2026 · Last reviewed May 31, 2026