Ondalık kayan nokta - Decimal floating point

Ondalık kayan nokta ( DFP ) aritmetiği, ondalık kayan nokta sayıları üzerinde hem bir gösterimi hem de işlemleri ifade eder . Doğrudan ondalık (taban-10) kesirler ile çalışmak, aksi takdirde 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 ortaya çıkan yuvarlama hatalarını önleyebilir.

Ondalık kayan nokta gösteriminin ondalık sabit nokta ve tamsayı gösterimine göre avantajı, çok daha geniş bir değer aralığını desteklemesidir. Örneğin, 8 ondalık basamak ve 2 ondalık basamak tahsis eden 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'i temsil edebilir, 1234567800000000, 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ı eklemek için kayan noktada kullanılabilir.

Uygulamalar

Ondalık kayan noktanın Erken mekanik kullanımları belirgindir abaküs , slayt kural , Smallwood hesap makinesi ve diğer bazı hesap makineleri bu destek girişleri bilimsel gösterim . Mekanik hesaplayıcılar söz konusu olduğunda, üs genellikle ayrı olarak hesaplanan yan bilgi olarak ele alınır.

IBM 650 bilgisayarı aksi ikili 1953 yılında kayan nokta formatı 8 basamaklı ondalık desteklenen Wang VS için kayan nokta destek kitaplığı makinesi 1977'de kayan nokta formatı 64 bit ondalık desteklenen Motorola 68040 işlemci bir 96 sağladı 1990'da -bit ondalık kayan nokta depolama biçimi.

Bazı bilgisayar dilleri , PL/I , C# , büyük ondalıklı Java , calc ile emacs ve Python'un ondalık modülü dahil olmak üzere ondalık kayan nokta aritmetiği uygulamalarına sahiptir . 1987 yılında, IEEE serbest IEEE 854 kayan noktalı veri diğer sistemlerle değişimi için kodlanmış nasıl için şartname yoksun ondalık kayan nokta ile hesaplanması için, standart. Bu daha sonra , iki farklı alternatif yöntemle de olsa ondalık kayan nokta verilerinin kodlanmasını standartlaştıran IEEE 754-2008'de ele alındı .

IBM POWER6 ve daha yeni POWER işlemciler, IBM System z9 (ve sonraki zSeries makineleri) gibi donanımda DFP'yi içerir . SilMinds, yapılandırılabilir bir vektör DFP yardımcı işlemcisi olan SilAx'ı sunar . IEEE 754-2008 bunu daha ayrıntılı olarak tanımlar. Fujitsu ayrıca donanımda DFP'ye sahip 64-bit Sparc işlemcilere sahiptir.

Microsoft C# veya .NET , System.Decimal'ı kullanır.

IEEE 754-2008 kodlaması

IEEE 754-2008 tanımlamış 32-, 64- ve 128-bit ondalık kayan nokta gösterimi. İkili kayan nokta biçimleri gibi, sayı bir işarete, bir üsse ve bir anlamlıya bölünür . İkili kayan noktadan farklı olarak, sayılar mutlaka normalleştirilmez; birkaç anlamlı basamaklı değerlerin birden fazla olası gösterimi vardır: 1×10 2 =0.1×10 3 =0.01×10 4 vb. Anlamlı sıfır olduğunda, üs herhangi bir değer olabilir.

IEEE 754-2008 ondalık kayan nokta biçimleri
ondalık 32 ondalık64 ondalık128 ondalık (32 k ) Biçim
1 1 1 1 İşaret alanı (bit)
5 5 5 5 Kombinasyon alanı (bit)
6 8 12 w = 2× k + 4 Üs devam alanı (bit)
20 50 110 t = 30× k -10 Katsayı devam alanı (bit)
32 64 128 32× bin Toplam boyut (bit)
7 16 34 p = 3× t /10+1 = 9× k -2 Katsayı boyutu (ondalık basamak)
192 768 12288 3×2 w = 48×4 k Üs aralığı
96 384 6144 Emax = 3×2 w -1 En büyük değer: 9.99...×10 Emax
-95 -383 -6143 Emin = 1−Emaks En küçük normalleştirilmiş değer 1.00...×10 Emin
-101 -398 -6176 Etiny = 2−p−Emaks Sıfır olmayan en küçük değer 1×10 Etiny

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

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

  • İkili tamsayı anlamlı ve alanına sahip biri , anlamlıyı 0 ile 10 p -1 arasında büyük bir ikili tamsayı olarak kodlar . Bunun ikili bir ALU kullanan yazılım uygulamaları için daha uygun olması bekleniyor .
  • Yoğun bir şekilde paketlenmiş ondalık anlamlı alana sahip bir diğeri, ondalık basamakları daha doğrudan kodlar. Bu, ikili kayan nokta biçiminden dönüştürmeyi 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ı bekleniyor.

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

Üssün en anlamlı iki biti 0−2 aralığıyla, en anlamlı 4 biti ise 0−9 aralığıyla sınırlıdır. 30 olası kombinasyon, sonsuzluk ve NaN için özel formlarla birlikte 5 bitlik bir alanda kodlanmıştır .

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

s 00mmm xxx   Exponent begins with 00, significand with 0mmm
s 01mmm xxx   Exponent begins with 01, significand with 0mmm
s 10mmm xxx   Exponent begins with 10, significand with 0mmm

Anlamlının baştaki 4 biti ikili 1000 veya 1001 ise (ondalık 8 veya 9) sayı aşağıdaki gibi başlar:

s 1100m xxx   Exponent begins with 00, significand with 100m
s 1101m xxx   Exponent begins with 01, significand with 100m
s 1110m xxx   Exponent begins with 10, significand with 100m

Baştaki bit (yukarıdakiler) bir işaret bitidir ve aşağıdaki bitler (yukarıdaki xxx) ek üs bitlerini ve en anlamlı basamağın geri 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 (see Extended real number line)
s 11111 0   quiet NaN (sign bit ignored)
s 11111 1   signaling NaN (sign bit ignored)

Sonraki durumlarda, kodlamanın diğer tüm bitleri yok sayılır. Böylece, bir diziyi tek bir bayt değeriyle doldurarak NaN'lere başlatmak mümkündür.

İkili tamsayı anlamlı alanı

Bu biçim, 0 ila 10 p -1 arasında bir ikili anlamlılık kullanır . Örneğin, Decimal32 anlamlısı en fazla 10 7 −1 = 9 999 999 = 98967F 16 = 1001 1000100101 10011111111 2 olabilir . 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 tarif edildiği gibi, kodlama significand en önemli 4 bit 0 ila 7 (0000 olup olmamasına bağlı olarak değişir 2 için 0111 2 ) ya da (1000 daha yüksek 2 ya da 1001 2 ).

İş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 önemli olan, burada parantez içinde gösterilen örtük bir önde 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, baştaki anlamlı basamağın 0 olduğu normal altı sayıları içerir .

İşaret bitinden sonraki 2 bit "11" ise, 8 bitlik üs alanı 2 bit sağa kaydırılır (hem işaret bitinden hem de ardından "11" bitten sonra) ve temsil edilen anlamlı kalan kısımdadır. 21 bit. Bu durumda, gerçek anlamlılıkta "100" önde gelen 3 bitlik bir dizi örtük (yani, depolanmayan) 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 bitlik dizi , anlam için örtük bir "100" 3 bitlik ön ek olduğunu gösterir.

Significand alanının lider bitleri anlamına Not değil en önemli ondalık basamak kodlamak; onlar sadece daha büyük bir saf ikili sayının parçasıdır. Örneğin, bir significand 8 000 000 , ikili olarak kodlanmış 0111 1010000100 1000000000 gelen 4 bit 7 kodlayan; 24. bit (ve dolayısıyla ikinci kodlama biçimi) gerektiren ilk anlamlı 2 23 = 8 388 608'dir .

Yukarıdaki durumlarda, temsil edilen değer:

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

Decimal64 ve Decimal128 benzer şekilde çalışır, ancak daha büyük üs devamı ve anlamlı alanlar ile. Decimal128 için, ikinci kodlama biçimi aslında hiç kullanılmaz; 10 34 −1 = 1ED09BEAD87C0378D8E63FFFFFFFF 16'nın en büyük geçerli anlamlısı 113 bit olarak gösterilebilir.

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

Bu sürümde, anlam değeri bir dizi ondalık basamak olarak saklanır. Baştaki rakam 0 ile 9 (3 veya 4 ikili bit) arasındadır ve önemli olanın geri kalanı yoğun paketlenmiş ondalık (DPD) kodlamayı kullanır.

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

Son olarak, her biri 3 ondalık basamağı kodlayan 2, 5 veya 11 adet 10 bitlik parçadan oluşan anlamlı ve devam alanı .

İşaret bitinden sonraki ilk iki bit "00", "01" veya "10" ise, bunlar üssün baştaki bitleridir ve bundan sonraki üç bit, baştaki ondalık basamak olarak yorumlanır (0 ila 7 arası). ):

    Comb.  Exponent          Significand
 s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]

İşaret bitinden sonraki ilk iki bit "11" ise, ikinci iki bit üssün baştaki bitleridir ve son bitin önüne ondalık basamağı (8 veya 9) oluşturmak için "100" eklenir:

    Comb.  Exponent          Significand
 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 ±sonsuz ve NaN'leri temsil etmek için kullanılır.

Kayan nokta aritmetik işlemleri

Kayan nokta aritmetiği gerçekleştirmek için genel kural, tam matematiksel değerin hesaplanması ve ardından sonucun belirtilen kesinlikte en yakın temsil edilebilir değere yuvarlanmasıdır. Bu aslında, normal yuvarlama davranışı altında ve istisnai koşulların yokluğunda, IEEE uyumlu bilgisayar donanımı için zorunlu kılınan davranıştır.

Sunum ve anlama kolaylığı için örneklerde 7 basamaklı kesinlik kullanılacaktır. Temel ilkeler her kesinlikte aynıdır.

Ek

Kayan noktalı sayıları eklemenin basit bir yöntemi, önce onları aynı üsle 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, yani taban 10'dur.

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

Buradan:

  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, bilimsel gösterime dönüştürmekten başka bir şey değildir . 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  (after shifting)
--------------------
  e=5;  s=1.235584654  (true sum: 123558.4654)

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

  e=5;  s=1.235585    (final sum: 123558.5)

İkinci işlenenin (654) düşük 3 basamağının esasen kaybolduğuna dikkat edin. Bu yuvarlama hatasıdır . 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 (after shifting)
----------------------
  e=5;  s=1.23456709876543 (true sum)
  e=5;  s=1.234567         (after rounding/normalization)

Bir başka anlam kaybı sorunu, 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 temsilidir.

  e=5;  s=1.234571
− e=5;  s=1.234567
----------------
  e=5;  s=0.000004
  e=−1; s=4.000000 (after rounding/normalization)

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

Bu hataların sonuçlarıyla ilgilenmek sayısal analizin konularıdır .

Çarpma işlemi

Çarpmak için anlamlılar çarpılır, üsler toplanır ve sonuç yuvarlanır ve normalleştirilir.

  e=3;  s=4.734612
× e=5;  s=5.417242
-----------------------
  e=8;  s=25.648538980104 (true product)
  e=8;  s=25.64854        (after rounding)
  e=9;  s=2.564854        (after normalization)

Bölme 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ığından küçük hatalar birikebilir. Pratikte, bu işlemlerin sayısal mantıkta gerçekleştirilme şekli oldukça karmaşık olabilir.

Ayrıca bakınız

Referanslar

daha fazla okuma