Ondalık kayan nokta - Decimal floating point

Ondalık kayan nokta (DFP) aritmetik, hem temsil hem de işlemler anlamına gelir ondalık kayan nokta sayılar. Doğrudan ondalık kesirlerle (10 tabanında) çalışmak, normalde ondalık kesirler (ölçümler veya finansal bilgiler gibi insan tarafından girilen verilerde yaygın olan) ve ikili (taban-2) kesirler arasında dönüştürme yaparken oluşan yuvarlama hatalarını önleyebilir.

Ondalık kayan nokta gösteriminin ondalık sayıya göre avantajı sabit nokta ve tamsayı temsil, çok daha geniş bir değer aralığını desteklemesidir. Örneğin, 8 ondalık basamak ve 2 ondalık basamak ayıran bir sabit nokta gösterimi 123456.78, 8765.43, 123.00 vb. Sayıları temsil edebilirken, 8 ondalık basamaklı bir kayan nokta gösterimi de 1.2345678, 1234567.8, 0.000012345678, 12345678000000000 vb. Bu daha geniş aralık, ardışık hesaplamalar sırasında yuvarlama hatalarının birikmesini önemli ölçüde yavaşlatabilir; örneğin, Kahan toplama algoritması asimptotik yuvarlama hatası birikimi olmadan birçok sayıyı toplamak için kayan noktada kullanılabilir.

Uygulamalar

Ondalık kayan noktanın erken mekanik kullanımları, abaküs, sürgülü hesap cetveli, Smallwood hesap makinesi ve diğerleri hesap makineleri girişleri destekleyen bilimsel gösterim. Mekanik hesaplayıcılar söz konusu olduğunda, üs genellikle ayrı olarak hesaplanan yan bilgiler olarak ele alınır.

IBM 650 bilgisayar 1953'te 8 basamaklı ondalık kayan nokta formatını destekledi.[1] Aksi takdirde ikili Wang VS makine, 1977'de 64 bit ondalık kayan nokta formatını destekledi.[2] İçin kayan nokta destek kitaplığı Motorola 68040 işlemci, 1990'da 96 bitlik ondalık kayan noktalı depolama formatı sağladı.[2]

Biraz bilgisayar dilleri dahil ondalık kayan nokta aritmetiği uygulamalarına sahip PL / I, C #, Java büyük ondalık emacs kireç ile ve Python ondalık modül. 1987'de, IEEE yayınlandı IEEE 854, ondalık kayan noktalı hesaplama standardı, kayan noktalı verilerin diğer sistemlerle değişim için nasıl kodlanması gerektiğine dair bir spesifikasyondan yoksundur. Bu daha sonra IEEE 754-2008, iki farklı alternatif yöntemle de olsa, ondalık kayan nokta verilerinin kodlanmasını standartlaştıran.

IBM POWER6 ve daha yeni POWER işlemciler, donanımda DFP'yi içerir. IBM System z9[3] (ve z10). SilMinds, yapılandırılabilir bir vektör DFP olan SilAx'ı sunar yardımcı işlemci.[4] IEEE 754-2008 bunu daha ayrıntılı olarak tanımlar. Fujitsu ayrıca 64 bit Sparc donanımda DFP'li işlemciler.[5][2]

Microsoft C # veya .AĞ, System.Decimal kullanır.[6]

IEEE 754-2008 kodlama

IEEE 754-2008 standart 32-, 64- ve 128-bit ondalık kayan nokta gösterimlerini tanımlar. İkili kayan nokta biçimleri gibi, sayı bir işaret, bir üs ve bir anlam. İkili kayan noktadan farklı olarak, sayıların normalize edilmesi gerekmez; az olan değerler önemli basamaklar birden fazla olası temsili var: 1 × 102=0.1×103=0.01×104, vb. Anlam sıfır olduğunda, üs herhangi bir değer olabilir.

IEEE 754-2008 ondalık kayan nokta biçimleri
ondalık32ondalık64ondalık 128ondalık (32k)Biçim
1111İşaret alanı (bitler)
5555Kombinasyon alanı (bitler)
6812w = 2×k + 4Üs devam alanı (bit)
2050110t = 30×k−10Katsayı devam alanı (bit)
326412832×kToplam boyut (bit)
71634p = 3×t/10+1 = 9×k−2Katsayı boyutu (ondalık basamak)
192768122883×2w = 48×4kÜs aralığı
963846144Emax = 3 × 2w−1En büyük değer 9,99 ... × 10'durEmax
−95−383−6143Emin = 1 − EmaxEn küçük normalleştirilmiş değer 1.00 ... × 10'durEmin
−101−398−6176Etiny = 2 − p − EmaxSıfır olmayan en küçük değer 1 × 10'durEtiny

Üs aralıkları, normalleştirilmiş değerler için mevcut aralık yaklaşık olarak simetrik olacak şekilde seçildi. Bu tam olarak çift sayıdaki olası üs değerleriyle yapılamayacağından, ekstra değer Emax'a verildi.

İki farklı temsil tanımlanmıştır:

  • Bir ikili tamsayı anlam alanı anlamlılığı 0 ile 10 arasında büyük bir ikili tam sayı olarak kodlarp−1. Bunun, ikili program kullanan yazılım uygulamaları için daha uygun olması beklenmektedir. ALU.
  • İle başka yoğun şekilde paketlenmiş ondalık anlam alanı ondalık basamakları daha doğrudan kodlar. Bu, ikili kayan noktalı forma ve formdan dönüşümü daha hızlı hale getirir, ancak verimli bir şekilde işlemek için özel donanım gerektirir. Bunun donanım uygulamaları için daha uygun olması beklenmektedir.

Her iki alternatif de tam olarak aynı temsil edilebilir değerler aralığını sağlar.

Üstün en önemli iki biti, 0−2 aralığı ile sınırlıdır ve anlamın en önemli 4 biti, 0−9 aralığı ile sınırlıdır. 30 olası kombinasyon, sonsuzluk için özel formlarla birlikte 5 bitlik bir alanda kodlanır ve NaN.

Anlamın en anlamlı 4 biti 0 ile 7 arasındaysa, kodlanan değer şu şekilde başlar:

s 00mmm xxx Üs 00 ile başlar, anlamlı ve 0 mmms ile başlar 01mmm xxx Üs 01 ile başlar, anlamlı ve 0 mmms ile başlar 10mmm xxx Üs 10 ile başlar, anlamlı ve 0mmm ile başlar

Anlamın önde gelen 4 biti ikili 1000 veya 1001 ise (ondalık 8 veya 9), sayı şu şekilde başlar:

s 1100m xxx Üs 00 ile başlar, anlamlı ve 100ms ile başlar 1101m xxx Üs 01 ile başlar, anlamlı ve 100ms ile başlar 1110m xxx Üs 10 ile başlar, anlamlı ve 100m ile başlar

Baştaki bit (yukarıdaki kısımlar) bir işaret bitidir ve aşağıdaki bitler (yukarıdaki xxx) ek üs bitlerini ve en anlamlı basamağın kalanını kodlar, ancak ayrıntılar kullanılan kodlama alternatifine bağlı olarak değişir.

Son kombinasyonlar sonsuzluklar ve NaN'ler için kullanılır ve her iki alternatif kodlama için de aynıdır:

s 11110 x ± Infinity (bkz. Genişletilmiş gerçek sayı doğrusu ) s 11111 0 sessiz NaN (işaret biti yoksayıldı) s 11111 1 sinyal NaN (işaret biti yoksayıldı)

İkinci durumlarda, kodlamanın diğer tüm bitleri göz ardı edilir. Bu nedenle, bir diziyi tek bir bayt değeriyle doldurarak NaN'lere başlatmak mümkündür.

İkili tamsayı anlam alanı

Bu biçim, 0'dan 10'a kadar ikili bir anlam kullanırp−1. Örneğin, Decimal32 anlamı 10'a kadar olabilir7−1 = 9999999 = 98967F16 = 1001100010010110011111112. Kodlama daha büyük anlamları temsil edebilirken, bunlar yasa dışıdır ve standart, girişte karşılaşılırsa, uygulamaların bunları 0 olarak ele almasını gerektirir.

Yukarıda açıklandığı gibi, kodlama, anlamın en önemli 4 bitinin 0 ila 7 (0000) aralığında olup olmadığına bağlı olarak değişir.2 0111'e kadar2) veya üzeri (10002 veya 10012).

İşaret bitinden sonraki 2 bit "00", "01" veya "10" ise, üs alanı işaret bitini takip eden 8 bitten oluşur (belirtilen 2 bit artı 6 bit "üs devam alanı") ve anlam, burada parantez içinde gösterilen örtük bir önde gelen 0 bit ile kalan 23 bittir:

 s 00eeeeee (0) ttt tttttttttt tttttttttt s 01eeeeee (0) ttt tttttttttt tttttttttt s 10eeeeee (0) ttt tttttttttt tttttttttt

Bu içerir normal altı sayılar baştaki anlamlı basamak 0'dır.

İşaret bitinden sonraki 2 bit "11" ise, 8 bitlik üs alanı 2 bit sağa kaydırılır (daha sonra hem işaret biti hem de "11" bitten sonra) ve temsil edilen anlam ve kalan kısımda yer alır. 21 bit. Bu durumda, gerçek anlamda örtük (yani depolanmamış) önde gelen 3 bitlik dizi "100" vardır:

 s 1100eeeeee (100) t tttttttttt tttttttttt s 1101eeeeee (100) t tttttttttt tttttttttt s 1110eeeeee (100) t tttttttttt tttttttttt

İşaret bitinden sonraki "11" 2-bit dizisi, bir örtük Anlam için "100" 3 bitlik önek.

Anlam alanının önde gelen bitlerinin değil en önemli ondalık basamağı kodlayın; bunlar daha büyük bir saf ikili sayının parçasıdır. Örneğin, bir anlamı 8000000 ikili olarak kodlanmıştır 011110100001001000000000önde gelen 4 bit 7 kodlu; 24. bit (ve dolayısıyla ikinci kodlama formu) gerektiren ilk anlam 2'dir23 = 8388608.

Yukarıdaki durumlarda, temsil edilen değer şöyledir:

(−1)işaret × 10üs − 101 × anlamlı

Decimal64 ve Decimal128, benzer şekilde, ancak daha büyük üslü devamlılık ve anlamlılık alanları ile çalışır. Decimal128 için, ikinci kodlama formu aslında hiçbir zaman kullanılmaz; 10'un en büyük geçerli anlamı34−1 = 1ED09BEAD87C0378D8E63FFFFFFFF16 113 bit olarak gösterilebilir.

Yoğun şekilde paketlenmiş ondalık anlam alanı

Bu versiyonda, anlamlılık bir dizi ondalık basamak olarak saklanır. Baştaki rakam 0 ile 9 (3 veya 4 ikili bit) arasındadır ve anlamın geri kalanı, yoğun şekilde paketlenmiş ondalık (DPD) kodlaması.

Üssün önde gelen 2 biti ve anlamlı ve baştaki basamağı (3 veya 4 bit), işaret bitini izleyen beş bitte birleştirilir. Bunu sabit ofsetli bir üs devam alanı takip eder.

Son olarak, 2, 5 veya 11 10 bitlik anlam ve devam alanı dekletler, her biri 3 ondalık basamağı kodlar.[7]

İşaret bitinden sonraki ilk iki bit "00", "01" veya "10" ise, bunlar üssün önde gelen bitleridir ve ondan sonraki üç bit, baştaki ondalık basamak olarak yorumlanır (0 ila 7 ):[8]

    Tarak. Üs Anlamı ve s 00 TTT (00) eeeeee (0TTT) [tttttttttt] [tttttttt] s 01 TTT (01) eeeeee (0TTT) [tttttttttt] [tttttttttt] s 10 TTT (10) eeeeee (0TTT) [tttttttttt]

İşaret bitinden sonraki ilk iki bit "11" ise, o zaman ikinci iki bit üssün önde gelen bitleridir ve son bit, öndeki ondalık basamağı (8 veya 9) oluşturmak için "100" önekini alır:

    Tarak. Üst Anlam ve s 1100 T (00) eeeeee (100T) [tttttttttt] [tttttttttt] s 1101 T (01) eeeeee (100T) [tttttttttt] [tttttttttt] s 1110 T (10) eeeeee (100T) [tttttttttt] [tttttttttt]

5 bitlik alanın kalan iki kombinasyonu (11110 ve 11111) sırasıyla ± sonsuzu ve NaN'leri temsil etmek için kullanılır.

Kayan nokta aritmetik işlemleri

Kayan nokta aritmetiğini gerçekleştirmenin olağan kuralı, tam matematiksel değerin hesaplanmasıdır.[9] ve sonuç daha sonra belirtilen hassasiyette en yakın gösterilebilir değere yuvarlanır. Aslında bu, normal yuvarlama davranışı altında ve istisnai koşulların yokluğunda IEEE uyumlu bilgisayar donanımı için zorunlu olan davranıştır.

Sunum ve anlaşılma kolaylığı için örneklerde 7 basamaklı kesinlik kullanılacaktır. Her hassasiyette temel ilkeler aynıdır.

İlave

Kayan nokta sayılarını eklemenin basit bir yöntemi, önce onları aynı üs ile temsil etmektir. Aşağıdaki örnekte, ikinci sayı 3 basamak sağa kaydırılmıştır. Her zamanki ekleme yöntemiyle devam ediyoruz:

Aşağıdaki örnek ondalıktır, bu basitçe tabanın 10 olduğu anlamına gelir.

  123456.7 = 1.234567 × 105  101.7654 = 1.017654 × 102 = 0.001017654 × 105

Dolayısıyla:

  123456.7 + 101.7654 = (1.234567 × 105) + (1.017654 × 102)                      = (1.234567 × 105) + (0.001017654 × 105)                      = 105 × (1.234567 + 0.001017654)                      = 105 × 1.235584654

Bu, dönüştürmekten başka bir şey değil bilimsel gösterim.Detayda:

  e = 5; s = 1,234567 (123456,7) + e = 2; s = 1,017654 (101,7654)
  e = 5; s = 1.234567 + e = 5; s = 0.001017654 (kaydırmadan sonra) -------------------- e = 5; s = 1.235584654 (gerçek toplam: 123558.4654)

Bu gerçek sonuç, işlenenlerin tam toplamıdır. 7 haneye yuvarlanacak ve ardından gerekirse normalleştirilecektir. Nihai sonuç şudur:

  e = 5; s = 1.235585 (nihai toplam: 123558.5)

İkinci işlenenin (654) düşük 3 rakamının esasen kaybolduğuna dikkat edin. Bu yuvarlama hatası. Aşırı durumlarda, sıfır olmayan iki sayının toplamı bunlardan birine eşit olabilir:

  e = 5; s = 1.234567 + e = −3; s = 9,876543
  e = 5; s = 1.234567 + e = 5; s = 0.00000009876543 (kaydırmadan sonra) ---------------------- e = 5; s = 1.23456709876543 (doğru toplam) e = 5; s = 1.234567 (yuvarlamadan / normalleştirmeden sonra)

Bir başka önem kaybı problemi, iki yakın sayı çıkarıldığında ortaya çıkar. E = 5; s = 1.234571 ve e = 5; s = 1.234567, 123457.1467 ve 123456.659 rasyonellerinin temsilleridir.

  e = 5; s = 1.234571− e = 5; s = 1.234567 ---------------- e = 5; s = 0,000004 e = −1; s = 4.000000 (yuvarlama / normalleştirmeden sonra)

Bu farkın en iyi temsili e = −1; e = −1'den% 20'den fazla farklı olan s = 4.877000; s = 4.000000. Aşırı durumlarda, kesin bir hesaplama birkaç milyon olsa bile nihai sonuç sıfır olabilir. Bu iptal hesaplanan bir sonucun tüm rakamlarının anlamlı olduğunu varsaymanın tehlikesini gösterir.

Bu hataların sonuçlarıyla başa çıkmak şu konulardaki konulardır: Sayısal analiz.

Çarpma işlemi

Çarpmak için, üsler eklenirken anlamlar çarpılır ve sonuç yuvarlanır ve normalleştirilir.

  e = 3; s = 4,734612 × e = 5; s = 5.417242 ----------------------- e = 8; s = 25.648538980104 (gerçek ürün) e = 8; s = 25.64854 (yuvarlamadan sonra) e = 9; s = 2.564854 (normalleştirmeden sonra)

Bölünme benzer şekilde yapılır, ancak bu daha karmaşıktır.

Çarpma veya bölme ile ilgili iptal veya soğurma sorunları yoktur, ancak işlemler tekrar tekrar yapıldığında küçük hatalar birikebilir. Uygulamada, bu işlemlerin dijital mantıkta gerçekleştirilme şekli oldukça karmaşık olabilir.

Ayrıca bakınız

Referanslar

  1. ^ Beebe, Nelson H.F. (2017/08/22). "Bölüm H. Tarihsel kayan nokta mimarileri". Matematiksel Fonksiyonlu Hesaplama El Kitabı - MathCW Taşınabilir Yazılım Kitaplığını Kullanarak Programlama (1 ed.). Salt Lake City, UT, ABD: Springer International Publishing AG. s. 948. doi:10.1007/978-3-319-64110-2. ISBN  978-3-319-64109-6. LCCN  2017947446.
  2. ^ a b c Savard, John J. G. (2018) [2007]. "Ondalık Kayan Nokta Standardı". dörtlü blok. Arşivlendi 2018-07-03 tarihinde orjinalinden. Alındı 2018-07-16.
  3. ^ "IBM z9 EC ve z9 BC - Herkese daha fazla değer sağlıyor" (PDF). 306.ibm.com. Alındı 2018-07-07.
  4. ^ "Finansal Uygulamalar için Aritmetik IP'ler - SilMinds". Silminds.com.
  5. ^ "Bölüm 4. Veri Biçimleri". Sparc64 X / X + Özellikleri. Nakahara-ku, Kawasaki, Japonya. Ocak 2015. s. 13.
  6. ^ ".NET'te ondalık kayan nokta". Yoda.arachsys.com.
  7. ^ Muller, Jean-Michel; Brisebarre, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Stehlé, Damien; Torres, Serge (2010). Kayan Nokta Aritmetiği El Kitabı (1 ed.). Birkhäuser. doi:10.1007/978-0-8176-4705-6. ISBN  978-0-8176-4704-9. LCCN  2009939668.
  8. ^ Ondalık Kodlama Spesifikasyonu, sürüm 1.00, IBM'den
  9. ^ Bilgisayar donanımının kesin değeri hesaplaması gerekmez; sanki sonsuz kesinlikteki sonucu hesaplamış gibi eşdeğer yuvarlatılmış sonucu üretmek zorundadır.

daha fazla okuma

Dış bağlantılar