Sabit nokta aritmetiği - Fixed-point arithmetic

Olarak işlem , sabit nokta temsil için bir yönteme değinmektedir fraksiyonel (tamsayı olmayan) sayılar da fraksiyonel parçanın basamak sabit sayıda depolayarak. Örneğin dolar miktarları, genellikle sentleri (1/100 doların) temsil eden tam olarak iki kesirli basamakla saklanır . Daha genel olarak, terim, kesirli değerleri bazı sabit küçük birimlerin tam sayı katları olarak temsil etmeye atıfta bulunabilir, örneğin, saatlerin kesirli bir miktarı, on dakikalık aralıkların tam sayı katları olarak. Sabit noktalı sayı gösterimi, genellikle daha karmaşık ve hesaplama gerektiren kayan nokta gösterimi ile çelişir .

Sabit nokta gösteriminde, kesir genellikle tamsayı kısmıyla aynı sayı tabanında ifade edilir , ancak b tabanının negatif güçleri kullanılır . En yaygın değişkenler ondalık (taban 10) ve ikilidir (taban 2). İkincisi yaygın olarak ikili ölçekleme olarak da bilinir . Böylece, n fraksiyonu basamak saklanır değeri her zaman bir tamsayı olacaktır çoklu arasında b - n . Sabit nokta gösterimi, örneğin büyük dolar değerlerini 1000$'ın katları olarak temsil ederken, tamsayı değerlerinin düşük sıralı basamaklarını atlamak için de kullanılabilir.

İnsan okuması için ondalık sabit noktalı sayılar görüntülendiğinde, kesir basamakları genellikle tamsayı kısmından bir sayı tabanı karakteriyle ayrılır (genellikle İngilizce'de '.', ancak ',' veya diğer birçok dilde başka bir sembol). Ancak dahili olarak bir ayrım yoktur ve iki basamak grubu arasındaki ayrım yalnızca bu tür sayıları işleyen programlar tarafından tanımlanır.

Sabit nokta gösterimi, mekanik hesap makinelerinde normdu . Modern işlemcilerin çoğunda hızlı kayan nokta birimi (FPU) olduğundan, sabit nokta gösterimleri artık yalnızca düşük maliyetli gömülü mikroişlemciler ve mikro denetleyiciler gibi özel durumlarda kullanılmaktadır ; görüntü , video ve dijital sinyal işleme gibi yüksek hız ve/veya düşük güç tüketimi ve/veya küçük çip alanı gerektiren uygulamalarda ; veya kullanımları sorun için daha doğal olduğunda. İkincisinin örnekleri, sent kesirlerinin kesin olarak belirlenmiş şekillerde tam sente yuvarlanması gerektiğinde dolar tutarlarının muhasebeleştirilmesidir ; ve değerlendirilmesi fonksiyonları ile başvuru çizelgesi .

temsil

Sabit nokta gösterimi 1/100 ölçekleme ile

Temsil edilen değer
İç
temsil
0,00 0
0,5 50
0.99 99
2 200
-14.1 -1410
314.160 31416

Kesirli bir sayının sabit noktalı gösterimi, esas olarak , sabit bir ölçeklendirme faktörü ile örtük olarak çarpılacak olan bir tamsayıdır . Örneğin, 1,23 değeri, 1/1000 örtük ölçekleme faktörü ile 1230 tamsayı değeri olarak bir değişkende saklanabilir (son 3 ondalık basamağın örtük olarak ondalık bir kesir olduğu varsayılır) ve 1 230 000 değeri , 1000 örtük ölçekleme faktörü ile 1230 olarak temsil edilebilir ("eksi 3" örtülü ondalık kesir basamaklı, yani sağda 3 örtük sıfır basamaklı). Bu gösterim, standart tamsayı aritmetik birimlerinin rasyonel sayı hesaplamaları yapmasına izin verir .

Negatif değerler genellikle ikili sabit nokta biçiminde , yukarıdaki gibi örtük bir ölçekleme faktörü ile ikinin tümleyen temsilinde işaretli bir tamsayı olarak temsil edilir. Kesir bitlerinin sayısı toplam bit sayısından büyük veya ona eşit olsa bile, değerin işareti her zaman ilk saklanan bit (1 = negatif, 0 = negatif olmayan) tarafından gösterilecektir. Örneğin, -3, +5 ve +12 ima edilen kesir bitleriyle alınan 8 bitlik işaretli ikili tamsayı (11110101) 2 = −11, −11/2 −3 = −88, −11/ değerlerini temsil eder. 2 5 = -0. 343 75 ve -11/2 12 = -0. Sırasıyla 002 685 546 875 .

Alternatif olarak, negatif değerler işaret büyüklüğü formatında bir tamsayı ile temsil edilebilir , bu durumda işaret hiçbir zaman ima edilen kesir bitlerinin sayısına dahil edilmez. Bu değişken, ondalık sabit nokta aritmetiğinde daha yaygın olarak kullanılır. Bu nedenle, -3, +5 ve +12 ima edilen ondalık kesir basamaklarıyla alınan işaretli 5 basamaklı ondalık tamsayı (−00025) 10 , −25/10 −3 = −25000, −25/10 5 = değerlerini temsil eder. -0.00025 ve -25/10 12 = -0. 000 000 000 025 , sırasıyla.

Bir program genellikle, belirli bir değişkende saklanacak veya belirli bir komut tarafından üretilecek olan tüm sabit noktalı değerlerin aynı ölçekleme faktörüne sahip olacağını varsayacaktır . Bu parametre genellikle ihtiyaç duyulan hassasiyete ve saklanacak değer aralığına bağlı olarak programcı tarafından seçilebilir .

Bir değişkenin veya formülün ölçekleme faktörü programda açıkça görünmeyebilir. İyi programlama uygulama o zaman içinde temin edilmesini gerektirmektedir belgelere bir şekilde en azından, yorumun içinde kaynak kodu .

Ölçeklendirme faktörlerinin seçimi

Daha fazla verimlilik için, ölçekleme faktörleri genellikle tamsayıları dahili olarak temsil etmek için kullanılan b tabanının güçleri (pozitif veya negatif) olarak seçilir . Ancak, genellikle en iyi ölçeklendirme faktörü uygulama tarafından belirlenir. Bu nedenle, tamsayılar dahili olarak ikili olarak temsil edilse bile, insan rahatlığı için genellikle 10'un katı olan ölçeklendirme faktörleri (örneğin dolar değerleri için 1/100) kullanılır. Ondalık ölçekleme faktörleri aynı zamanda metrik (SI) sistemle de uyumludur , çünkü sabit noktalı ölçekleme faktörünün seçimi genellikle bir ölçü biriminin seçimine eşdeğerdir ( metre yerine santimetre veya mikron gibi ).

Bununla birlikte, ara sıra başka ölçeklendirme faktörleri de kullanılabilir, örneğin, saatlerin kesirli bir miktarı, saniyelerin tam sayısı olarak gösterilebilir; yani, 1/3600 ölçek faktörüne sahip sabit noktalı bir sayı olarak.

En dikkatli yuvarlamada bile, S ölçekleme faktörü ile temsil edilen sabit noktalı değerler , saklanan tamsayıda ±0,5'e kadar, yani değerde ±0,5 S'ye kadar bir hataya sahip olabilir . Bu nedenle, daha küçük ölçeklendirme faktörleri genellikle daha doğru sonuçlar verir.

Öte yandan, daha küçük bir ölçekleme faktörü, belirli bir program değişkeninde saklanabilecek daha küçük bir değer aralığı anlamına gelir. Bir değişkende depolanabilecek maksimum sabit nokta değeri, içinde depolanabilecek en büyük tamsayı değeridir ve ölçekleme faktörü ile çarpılır; ve benzer şekilde minimum değer için. Örneğin, aşağıdaki tabloda zımni ölçekleme faktörü veriyor S , minimum ve maksimum değerler gösterilebilen V min ve V max ve doğruluk δ = S , 16-bit işaretli ikili sabit nokta biçiminde temsil edilebilir değerler / 2, bağlı ima edilen kesir bitlerinin sayısı f üzerinde.

Bazı 16 bitlik işaretli ikili sabit nokta biçimlerinin parametreleri
F S δ V dk V maks
-3 1/2 −3 = 8 4 262 144 + 262 143
0 1/2 0 = 1 0,5 - 32 768 + 32 767
5 1/2 5 = 1/32 < 0.016 -1024. 000 00 +1023. 968 75
14 1/2 14 = 1/ 16 384 < 0.0 000 031 -2. 000 000 000 000 00 +1. 999 938 964 843 75
15 1/2 15 = 1/ 32 768 < 0.0 000 016 -1. 000 000 000 000 000 +0. 999 969 482 421 875
16 1/2 16 = 1/ 65 536 < 0.0 000 008 -0. 500 000 000 000 000 0 +0. 499 984 741 210 937 5
20 1/2 20 = 1/ 1 048 576 < 0.0 000 000 5 -0. 031 250 000 000 000 000 00 +0. 031 249 046 325 683 593 75

2 n -1 (yani 1, 3, 7, 15, 31, vb.) şeklindeki ölçekleme faktörlerine sahip sabit nokta biçimlerinin, görüntü işleme ve diğer dijital sinyal işleme görevleri için uygun olduğu söylenmiştir. Sabit ve kayan noktalı değerler arasında normal 2 n ölçeklemeye göre daha tutarlı dönüşümler sağlamaları beklenir . Julia programlama dili uygular hem sürümleri.

Kesin değerler

1/16 veya 17/32 gibi herhangi bir ikili kesir a /2 m , herhangi bir nm ile 1/2 n'nin iki katı ölçekleme faktörü ile sabit noktada tam olarak temsil edilebilir . Bununla birlikte, 0.1 veya 0.123 gibi çoğu ondalık kesir, 2. tabanda sonsuz yinelenen kesirlerdir ve bu nedenle bu şekilde temsil edilemezler.

Benzer şekilde, herhangi bir ondalık kesir bir / 10 m , örneğin 1/100 ya da 37/1000 olarak, tam olarak bir güç-of-on ölçekleme faktörü 1/10 ile sabit nokta olarak temsil edilebilir n herhangi nm . Bu ondalık biçim ayrıca 1/8 (0,125) veya 17/32 (0,53125) gibi herhangi bir ikili kesri a /2 m temsil edebilir .

Daha genel olarak, bir rasyonel sayı a / b ile, bir ve b aralarında asal ve b pozitif tam olarak yalnızca ikili sabit nokta olarak temsil edilebilir b 2'nin bir güçtür; ve ondalık yalnızca noktasını sabit b hayır vardır asal 2 ve / veya 5'ten diğer faktörler.

Kayan nokta ile karşılaştırma

Sabit noktalı hesaplamalar, kayan noktalı hesaplamalardan daha hızlı olabilir ve/veya daha az donanım kullanabilir. Temsil edilecek değerlerin aralığı önceden biliniyorsa ve yeterince sınırlıysa, sabit nokta mevcut bitlerden daha iyi faydalanabilir. Örneğin, 0 ile 1 arasındaki bir sayıyı temsil etmek için 32 bit mevcutsa, sabit nokta gösterimi 1,2 × 10 −10'dan daha az hataya sahip olabilirken , standart kayan nokta gösterimi 596 × 10 −10'a kadar hataya sahip olabilir. — çünkü bitlerin 9'u dinamik ölçekleme faktörünün işareti ve üssü ile boşa harcanır.

Sabit noktalı hesaplamalar kullanan programlar, bir FPU'nun kullanılabilirliğine bağlı olmadıklarından, genellikle kayan nokta kullananlardan daha taşınabilirdir. Bu avantaj, aynı verilere sahip kayan nokta hesaplamaları üreticiye ve genellikle bilgisayar modeline bağlı olarak farklı sonuçlar verdiğinde , IEEE Kayan Nokta Standardı yaygın olarak benimsenmeden önce özellikle güçlüydü .

Tamsayı aritmetik birimleri önemli ölçüde daha az mantık kapısı gerektirdiğinden ve bir FPU'dan çok daha küçük yonga alanı tükettiğinden , birçok gömülü işlemcide FPU yoktur; ve düşük hızlı cihazlarda kayan noktanın yazılım öykünmesi çoğu uygulama için çok yavaş olacaktır. Intel 386 ve 486SX gibi önceki kişisel bilgisayarlar ve oyun konsolları için CPU yongaları da bir FPU'dan yoksundu.

Mutlak herhangi bir sabit noktalı biçimde çözünürlüğü (ardışık değerler arasındaki fark) dizi, yani ölçeklendirme faktörü boyunca sabit olduğu S . Buna karşılık, bir kayan nokta formatının göreli çözünürlüğü, b tabanının bir faktörü içinde değişen, tüm aralıkları boyunca yaklaşık olarak sabittir ; oysa mutlak çözünürlükleri, değerlerin kendileri gibi birçok büyüklük derecesine göre değişir.

Çoğu durumda, sabit noktalı hesaplamaların yuvarlama ve kesme hatalarını analiz etmek, eşdeğer kayan nokta hesaplamalarından daha kolaydır. Öte yandan, sabit nokta kullanımı programcı tarafından daha fazla özen gerektirir. Taşmanın önlenmesi, değişken aralıkları ve hesaplamadaki tüm ara değerler için çok daha sıkı tahminler ve ayrıca ölçekleme faktörlerini ayarlamak için genellikle fazladan kod gerektirir.

Uygulamalar

Ondalık sabit noktanın yaygın bir kullanımı, kayan noktalı sayıların karmaşık yuvarlama kurallarının genellikle bir yükümlülük olduğu parasal değerleri depolamak içindir. Örneğin, C ile yazılmış açık kaynak para yönetimi uygulaması GnuCash 1.6 sürümünden itibaren kayan noktadan sabit noktaya bu nedenle geçmiştir.

İkili sabit nokta (ikili ölçekleme), 1960'ların sonlarından 1980'lere kadar, uçuş simülasyonu ve nükleer santral kontrol algoritmaları gibi matematiksel olarak yoğun olan gerçek zamanlı hesaplama için yaygın olarak kullanıldı . Halen birçok DSP uygulamasında ve özel yapım mikroişlemcilerde kullanılmaktadır. Açıları içeren hesaplamalar, ikili açısal ölçümü (BAM) kullanır.

İkili sabit nokta olarak kullanılır STM32G4 seri CORDIC ko-işlemciler ve ayrık kosinüs dönüşümü sıkıştırmak için kullanılan (DCT) algoritmaları JPEG resim.

Operasyonlar

Toplama ve çıkarma

Aynı örtük ölçekleme faktörüne sahip iki değeri eklemek veya çıkarmak için, temel tamsayıları eklemek veya çıkarmak yeterlidir; sonuç, ortak örtük ölçeklendirme faktörüne sahip olacaktır, bu nedenle işlenenlerle aynı program değişkenlerinde saklanabilir. Bu işlemler, taşma olmadığı, yani elde edilen tamsayı alıcı program değişkeninde saklanabildiği sürece tam matematiksel sonucu verir . Değerler farklı ölçeklendirme faktörlerine sahipse, işlemden önce ortak bir ölçeklendirme faktörüne dönüştürülmeleri gerekir.

Çarpma işlemi

İki sabit noktalı sayıyı çarpmak için, temeldeki iki tamsayıyı çarpmak ve sonucun ölçekleme faktörünün, onların ölçekleme faktörlerinin ürünü olduğunu varsaymak yeterlidir. Sonuç, alıcı değişkeni aşmaması koşuluyla, yuvarlama olmadan kesin olacaktır.

Örneğin, 1/1000 (0,123) ile ölçeklenen 123 ve 1/10 (2,5) ile ölçeklenen 25 sayıları çarpıldığında, (1/1000)×(1/10) ile ölçeklenen 123×25 = 3075 tamsayısını verir = 1/10000 , yani 3075/10000 = 0.3075. Başka bir örnek olarak, ilk sayının 1/32 (155/32 = 4.84375) ile örtük olarak ölçeklenen 155 ile çarpılması, örtük ölçekleme faktörü (1/1000)×(1/32) = 1/32000 ile 123×155 = 19065 tamsayısını verir. , yani 19065/32000 = 0.59578125.

Bölüm

İki sabit noktalı sayıyı bölmek için, altta yatan tamsayıların tamsayı bölümü alınır ve ölçekleme faktörünün, ölçekleme faktörlerinin bölümü olduğu varsayılır. Genel olarak, birinci bölme yuvarlama gerektirir ve bu nedenle sonuç kesin değildir.

Örneğin, 1/100 (34.56) ile ölçeklenen 3456 ve 1/1000 (1.234) ile ölçeklenen 1234'ün bölünmesi, ölçek faktörü (1/100)/(1/1000) = ile 3456÷1234 = 3 (yuvarlak) tamsayısını verir. 10, yani 30. Başka bir örnek olarak, ilk sayının 1/32 (155/32 = 4.84375) ile örtük olarak ölçeklenen 155'e bölümü, örtük ölçekleme faktörü (1/) ile 3456÷155 = 22 (yuvarlak) tamsayısını verir. 100)/(1/32) = 32/100 = 8/25, yani 22×32/100 = 7.04.

Sonuç kesin değilse, yuvarlamadan kaynaklanan hata, payın daha küçük bir ölçekleme faktörüne dönüştürülmesiyle azaltılabilir veya hatta ortadan kaldırılabilir. Örneğin, r = 1.23, 1/100 ölçekleme ile 123 olarak ve s = 6.25, 1/1000 ölçekleme ile 6250 olarak temsil edilirse, tamsayıların basit bölümü, ölçekleme faktörü ile 123÷6250 = 0 (yuvarlak) verir ( 1/100)/(1/1000) = 10. Eğer r ilk olarak 1/1000000 ölçekleme faktörü ile 1.230.000'e dönüştürülürse, sonuç 1.230.000÷6250 = 197 (yuvarlak) ve ölçek faktörü 1/1000 (0.197) olacaktır. 1,23/6,25'in tam değeri 0,1968'dir.

Ölçeklendirme dönüşümü

Sabit noktalı hesaplamada genellikle bir değeri farklı bir ölçeklendirme faktörüne dönüştürmek gerekir. Bu işlem gereklidir, örneğin:

  • Farklı bir örtük ölçekleme faktörüne sahip bir program değişkenine bir değer depolamak için;
  • İki değeri aynı ölçeklendirme faktörüne dönüştürmek, böylece toplanabilmeleri veya çıkarılabilmeleri için;
  • Bir değerin orijinal ölçekleme faktörünü başka bir değerle çarptıktan veya böldükten sonra eski haline getirmek için;
  • Bir bölünme sonucunun doğruluğunu artırmak için;
  • Bir çarpım veya bölümün ölçekleme faktörünün 10 n veya 2 n gibi basit bir güç olmasını sağlamak için ;
  • Bir işlemin sonucunun taşma olmadan bir program değişkeninde saklanabilmesini sağlamak için;
  • Sabit nokta verilerini işleyen donanımın maliyetini azaltmak.

Bir sayıyı, R ölçekleme faktörüne sahip sabit nokta türünden S ölçekleme faktörüne sahip başka bir türe dönüştürmek için , temeldeki tamsayı, R / S oranıyla çarpılmalıdır . Bu nedenle, örneğin, 1.23 = 123/100 değerini R = 1/100 ölçekleme faktöründen S =1/1000 ölçekleme faktörü ile bire dönüştürmek için , 123 tamsayısının (1/100)/(1/1000) ile çarpılması gerekir. ) = 10, temsili 1230/1000 verir.

Ölçekleme faktörü, tamsayıyı temsil etmek için dahili olarak kullanılan tabanın bir gücüyse, ölçeklendirme faktörünün değiştirilmesi, tamsayının yalnızca düşük sıralı basamaklarının düşürülmesini veya sıfır basamak eklenmesini gerektirir. Ancak bu işlem sayının işaretini korumalıdır. İkinin tümleyen gösteriminde bu, aritmetik kaydırma işlemlerinde olduğu gibi işaret bitinin genişletilmesi anlamına gelir .

Eğer S bölünmemesi R (yeni ölçekleme faktörü ise, özellikle, S , orijinal daha büyük olan R ), yeni bir tam sayı olması gerekebilir yuvarlak .

Özellikle, r ve s örtük ölçeklendirme faktörleri R ve S olan sabit noktalı değişkenlerse , rr × s işlemi , ilgili tam sayıların çarpılmasını ve sonucun açıkça S ile bölünmesini gerektirir . Sonucun yuvarlatılması gerekebilir ve taşma meydana gelebilir.

Örneğin, ortak ölçeklendirme faktörü 1/100 ise, 1,23'ü 0,25 ile çarpmak, 1/10000 ara ölçekleme faktörü ile 3075 elde etmek için 123'ü 25 ile çarpmayı gerektirir. Orijinal ölçeklendirme faktörü 1/100'e geri dönmek için 3075 tamsayısının 1/100 ile çarpılması, yani 100'e bölünmesi ve yuvarlama ilkesine bağlı olarak 31 (0.31) veya 30 (0.30) elde edilmesi gerekir. kullanılmış.

Benzer şekilde, rr / s işlemi tam sayıların bölünmesini ve bölümün S ile açıkça çarpılmasını gerektirecektir . Burada da yuvarlama ve/veya taşma olabilir.

Kayan noktadan ve kayan noktadan dönüştürme

Bir sayıyı kayan noktadan sabit noktaya dönüştürmek için, S ölçekleme faktörüne bölünebilir , ardından sonuç en yakın tam sayıya yuvarlanabilir. Sonucun hedef değişkene veya kayda uyduğundan emin olmak için özen gösterilmelidir. Ölçekleme faktörüne ve depolama boyutuna ve aralık giriş numaralarına bağlı olarak, dönüştürme herhangi bir yuvarlama gerektirmeyebilir.

Sabit noktalı bir sayıyı kayan noktaya dönüştürmek için, tam sayı kayan noktaya dönüştürülebilir ve ardından S ölçekleme faktörü ile çarpılabilir . Bu dönüştürme, tamsayının mutlak değeri 2 24'ten (ikili tek kesinlikli IEEE kayan nokta için) veya 2 53'ten (çift kesinlik için) büyükse yuvarlamayı gerektirebilir . Taşma veya Yetersizlik durumunda oluşabilir | S | olduğu çok büyük veya çok sırasıyla küçük.

Donanım desteği

Ölçekleme ve yeniden normalleştirme

Tipik işlemcilerin sabit nokta aritmetiği için özel desteği yoktur. Ancak, ikili aritmetiği olan çoğu bilgisayarda, bir tamsayıyı 2'nin herhangi bir kuvvetiyle çarpabilen veya bölebilen hızlı bit kaydırma talimatları vardır; özellikle, bir aritmetik kaydırma talimatı. Bu talimatlar, sayının işaretini korurken, 2'nin katı olan ölçekleme faktörlerini hızla değiştirmek için kullanılabilir.

Gibi erken bilgisayarlar kullanım IBM 1620 ve Burroughs B3500 el ikili kodlanmış ondalık her ondalık haneli bağımsız bir şekilde, 4 bit ile kodlanmış 10 örneğin taban tamsayı için (BCD) temsil. Mikrodenetleyiciler gibi bazı işlemciler bunu kullanmaya devam edebilir. Bu tür makinelerde, ondalık ölçekleme faktörlerinin dönüştürülmesi, bit kaydırma ve/veya bellek adresi manipülasyonu ile gerçekleştirilebilir.

Bazı DSP mimarileri, belirli sabit nokta biçimleri için yerel destek sunar, örneğin , n- 1 kesir bitli işaretli n -bit sayılar (değerleri -1 ile neredeyse +1 arasında değişebilir). Destek, yeniden normalleştirmeyi içeren bir çarpma talimatı içerebilir - ürünün 2 n −2'den n −1 kesir bitine ölçeklendirme dönüşümü . CPU bu özelliği sağlamıyorsa, programcı ürünü yeterince büyük bir kayıt veya geçici değişkene kaydetmeli ve yeniden normalleştirmeyi açıkça kodlamalıdır.

taşma

Bir aritmetik işlemin sonucu, belirlenen hedef alanda depolanamayacak kadar büyük olduğunda taşma meydana gelir. Toplama ve çıkarma işlemine ek olarak, sonuç işlenenlerden bir bit daha fazlasını gerektirebilir. m ve n bitli iki işaretsiz tamsayı çarpıldığında , sonuç m + n bit olabilir.

Un ölçekli tamsayıdır modülo 2 azaltılmış olur olarak taşması durumunda, yüksek sıralı parçası genellikle, kaybolur , n burada n, depolama alanının büyüklüğüdür. Özellikle işaret biti kaybolur, bu da işareti ve değerin büyüklüğünü kökten değiştirebilir.

Bazı işlemciler bir donanım taşması bayrağı ayarlayabilir ve/veya bir taşma meydana geldiğinde bir istisna oluşturabilir . Bazı işlemciler bunun yerine doygunluk aritmetiği sağlayabilir : bir toplama veya çıkarmanın sonucu taşacaksa, bunun yerine alıcı alana sığabilecek ve doğru işarete sahip en büyük büyüklüğe sahip değeri depolarlar.

Ancak bu özellikler pratikte pek kullanışlı değildir; taşma olasılığını dışlamak için ölçekleme faktörlerini ve sözcük boyutlarını seçmek veya işlemi gerçekleştirmeden önce işlenenlerde aşırı değerler olup olmadığını kontrol etmek genellikle daha kolay ve daha güvenlidir.

Bilgisayar dili desteği

Sabit nokta gösterimi ve hesaplamaları için açık destek, birkaç bilgisayar dili, özellikle PL/I , COBOL , Ada , JOVIAL ve Coral 66 tarafından sağlandı . Değişkenlere ve işlevlere atanabilecek sabit noktalı sayısal veri türleri , ikili ve/veya ondalık sağladılar . Derleyici daha sonra rs × t + u gibi ifadeleri çevirirken , bu değişkenlerin değerlerini okurken veya yazarken veya bunları kayan nokta gibi diğer veri türlerine dönüştürürken uygun ölçeklendirme dönüşümlerini yapmak için otomatik olarak kod oluşturur .

Bu dillerin çoğu 1940 ile 1990 arasında tasarlandı. Daha modern diller genellikle herhangi bir sabit noktalı veri türü veya ölçekleme faktörü dönüştürme desteği sunmaz. Bu aynı zamanda FORTRAN , C ve C++ gibi hala çok popüler olan birkaç eski dil için de geçerlidir . Katı bir şekilde standartlaştırılmış davranışa sahip hızlı kayan noktalı işlemcilerin geniş kullanılabilirliği, ikili sabit nokta desteği talebini büyük ölçüde azaltmıştır. Benzer şekilde, C# ve Python gibi bazı programlama dillerinde ondalık kayan nokta desteği , ondalık sabit nokta desteği ihtiyacının çoğunu ortadan kaldırmıştır. Sabit nokta işlemlerini gerektiren birkaç durumda, bunlar programcı tarafından açık ölçeklendirme dönüşümüyle herhangi bir programlama dilinde uygulanabilir.

Öte yandan, tüm ilişkisel veritabanları ve SQL notasyonu, sabit noktalı ondalık aritmetiği ve sayıların depolanmasını destekler. PostgreSQL'in özel birsayısal 1000 basamağa kadar sayıların tam olarak saklanması için yazın.

Ayrıca, 2008'de Uluslararası Standartlar Organizasyonu (ISO), gömülü işlemcilerde çalışan programların yararına, C programlama dilini sabit noktalı veri türleriyle genişletmek için bir teklif yayınladı. Ayrıca, GNU Derleyici Koleksiyonu (GCC), sabit nokta için arka uç desteğine sahiptir .

Ayrıntılı örnekler

Ondalık sabit nokta çarpımı

2 sabit nokta 3 ondalık basamak sayıları ile aşağıdaki çarpma olduğunu varsayalım.

(10.500)(1.050) =1*10.500 + 0.050*10.500 = 10.500+0.525000=11.025000

3 ondalık basamak olduğundan, sondaki sıfırları nasıl gösterdiğimize dikkat edin. Bunu bir tamsayı çarpması olarak yeniden karakterize etmek için önce tüm ondalık basamakları tamsayılara taşıyarak 1000 (10^3) ​​ile çarpmalıyız, sonra onları geri koymak için (10^-3) ile çarpacağız denklem şimdi benziyor

(10.500)(10^(3)) (1.050)(10^(3))  (10^(-3))(10^(-3))
= (10500)(1050) (10^-6)
= 11 025 000  (10^-6)
= 11.025000

Bu, farklı bir taban, özellikle de hesaplama için taban 2 seçersek aynı şekilde çalışır, çünkü bir bit kaydırma, 2'lik bir çarpma veya bölme ile aynıdır. ikili noktadan sonra 10 bit. En yakın yaklaşım 0.0000110011'dir.

10= 8+2=2^3+2^1
1=2^0
0.5= 2^-1
0.05= 0.0000110011_2

Böylece çarpmamız olur

(1010.100)(2^3)(1.0000110011)(2^10) (2^-13)
=(1010100)(10000110011) (2^-13)
=(10110000010111100) (2^-13)
=1011.0000010111100

Bu, ondalık noktadan sonra üç basamakla 11.023'e yuvarlanır.

İkili sabit noktalı çarpma

1.2 ve 5.6'nın çarpımını ikili sabit nokta ile 16 kesir biti kullanarak hesaplama görevini düşünün. 2 ile bir çarpma işlemi, bunları iki sayı temsil etmek 16 elde edilmesi, 78 643 .2 ve 367 001 .6; ve bu değerleri en yakın tamsayılara yuvarlayarak 78 643 ve 367 002 elde edin . Bu sayılar, ikisinin tamamlayıcı imzalı biçimiyle 32 bitlik bir kelimeye rahatça sığacaktır.

Bu tam sayıların çarpılması, herhangi bir yuvarlama olmaksızın 32 kesir bitli 35 bitlik 28 862 138 286 tamsayısını verir . Bu değeri doğrudan 32 bitlik bir tamsayı değişkenine kaydetmenin, en önemli bitlerin taşmasına ve kaybolmasına neden olacağını unutmayın. Uygulamada, muhtemelen imzalı bir 64-bit tamsayı değişkeninde veya register içinde saklanacaktır .

Sonuç, 16 kesir biti ile verilerle aynı formatta saklanacaksa, bu tamsayı 2 16'ya bölünmelidir , bu da yaklaşık olarak 440 401 .28 verir ve ardından en yakın tam sayıya yuvarlanmalıdır. Bu efekt, 2 15 eklenerek ve ardından sonucu 16 bit kaydırılarak elde edilebilir . Sonuç, 6,719 985 961 914 062 5 değerini temsil eden 440 401'dir . Biçimin kesinliği dikkate alındığında, bu değer daha iyi 6. 719 986 ± 0.0 000 008 (işlenen yaklaşıklıklarından gelen hatayı hesaba katmadan) olarak ifade edilir. Doğru sonuç 1.2 × 5.6 = 6.72 olacaktır.

Daha karmaşık bir örnek için, 1.2 ve 5.6 sayılarının 32 bit sabit nokta biçiminde sırasıyla 30 ve 20 kesir bitiyle temsil edildiğini varsayalım. 2 30 ve 2 20 ile ölçeklendirme , 1 288 490 188 .8 ve 5 872 025 .6 verir, bu da sırasıyla 1 288 490 189 ve 5 872 026'ya yuvarlanır . Her iki sayı da 32 bit işaretli bir tamsayı değişkenine sığar ve kesirleri temsil eder.

1. 200 000 000 186 264 514 923 095 703 125 ve
5. 600 000 381 469 726 562 50

Ürünleri (tam olarak) 53-bit tamsayıdır 7 566 047 890 552 914 , 30+20 = 50 ima edilen kesir bitine sahiptir ve bu nedenle kesri temsil eder.

6. 720 000 458 806 753 229 623 609 513 510

Bu değeri işaretli 16 bitlik sabit formatta 8 kesir biti ile temsil etmeyi seçersek , tamsayı çarpımı 2 50-8 = 2 42'ye bölmeli ve sonucu yuvarlamalıyız; bu, 2 41 eklenerek ve 42 bit kaydırılarak elde edilebilir . Sonuç 1720'dir ve 1720/2 8 = 6. 718 75 değerini veya yaklaşık olarak 6.719 ± 0.002 değerini temsil eder .


gösterimler

Sabit nokta formatının parametrelerini kısaca belirtmek için çeşitli gösterimler kullanılmıştır. Aşağıdaki listede f , kesirli bitlerin sayısını, m büyüklük veya tamsayı bitlerinin sayısını , s işaret bitlerinin sayısını ve b toplam bit sayısını temsil eder.

  • COBOL programlama dili başlangıçta biçimi ile "grafiksel" belirtildi keyfi boyut ve ondalık ölçekleme ile ondalık sabit hassasiyet desteklenen PICdirektifi. Örneğin, PIC S9999V99iki ondalık kesir basamağı olan bir işaret büyüklüğü 6 basamaklı ondalık tamsayı belirtildi.
  • REAL FIXED BINARY (p ,f yapısı ), PL/I programlama dilinde, kesir kısmında f bitleri ile p toplam biti (işaret dahil değil) ile bir sabit nokta işaretli ikili veri tipini belirtmek için kullanıldı ; bu, 1/2 f ölçekleme faktörüne sahip p +1 bit işaretli bir tamsayıdır . İkincisi olumlu veya olumsuz olabilir. Bir belirleyebildiğinde yerine ve yerine tabanı 10 için.COMPLEXREALDECIMALBINARY
  • Gelen Ada programlama dili , bir sayısal veri tipi, örneğin, ile belirlenebilir type F is delta 0.01 range -100.0 .. 100.07 zımni fraksiyon bit (bir ölçekleme faktörü 1/128 providin) ile ikinin tümleyici biçiminde bir ikilik tamsayı oluşan bir sabit nokta gösterimi, yani toplam en az 15 bit (-128.00 ile neredeyse +128.00 arasında gerçek bir aralık sağlanması).
  • S notasyonu ile tanımlanmıştır Texas Instruments . Bir , f kesir bitleriyle işaretli bir ikili sabit nokta değeri belirtmek için Qf yazar ; örneğin, 1/2 15 ölçekleme faktörü ile ikiye tümleyen gösterimde işaretli bir tamsayı belirtir . Kod m, f belirten sayı vardır ek olduğu m işaret bitini sayım değeri tamsayı kısmı bitleri. Bu nedenle faktör 1/2 ölçekleme ile bir 32-bit 2 tümleme tam sayı olarak depolanabilir 1 tam sayı bit ve 30 fraksiyonel bit ikili sabit nokta biçimini tarif olur 30 . Benzer bir gösterim, ARM tarafından , işaret bitini m değerinde saymaları dışında kullanılmıştır ; bu nedenle yukarıdaki aynı biçim olarak belirtilecektir .Q15Q.Q1.30Q2.30
  • Bm gösterimi , tamsayı kısmında m bitlik sabit bir ikili format anlamında kullanılmıştır ; kelimenin geri kalanı kesir bitleridir. Örneğin, işaretli bir B16sayı içinde saklanabilecek maksimum ve minimum değerler sırasıyla ≈32767.9999847 ve −32768.0'dır.
  • VISSIM kullanılan işletme fxm .b ile ikili bir sabit nokta değeri ifade etmek için b toplam bit ve m, tam sayı kısmen bit; yani, ölçekleme faktörü 1/2 b - m olan bir b -bit tamsayı . Bu nedenle , tamsayı kısmında 1 bit ve kesirde 15 olan 16 bitlik bir sayı anlamına gelir.fx1.16
  • PS2 GS ( "Grafik Synthesizer" ) Kullanıcı Kılavuzu notasyonu kullanan lar :m :f , s işaret biti varlığını (0 veya 1) belirtir. Örneğin, 0:5:31/2 3 ölçekleme faktörüne sahip işaretsiz 8 bitlik bir tamsayıyı temsil eder .
  • LabVIEW programlama dili gösterimini kullanan <lar ,b ,m> bir 'FXP' sabit nokta sayılarının parametrelerini belirlemek için. S bileşeni sırasıyla işaretsiz veya 2 tümleme imza dizi ya gösteren, ya da '+' veya '±' olabilir. B bileşeni, toplam bit sayısı, ve m, tam sayı kısmen bit sayısıdır.

Yazılım uygulama örnekleri

  • Popüler TrueType yazı tipi biçimi, yönergelerinde bazı sayısal değerler için ondalık sayının solunda 26 bit ile 32 bit işaretli ikili sabit nokta kullanır. Bu biçim, ipucu verme ve performans nedenleriyle gereken minimum düzeyde kesinlik sağlamak üzere seçilmiştir .
  • Sony'nin orijinal PlayStation'ı , Sega'nın Saturn'ü , Nintendo'nun Game Boy Advance'i (yalnızca 2D ), Nintendo DS (2D ve 3D), Nintendo Gamecube ve FPU'su olmayan GP2X Wiz video oyun sistemlerindeki tüm 3D grafik motorları, sabit nokta aritmetiği kullandı. PlayStation, dönüşüm yardımcı işlemcisinde 12 kesir biti ile 16 bit sabit nokta için donanım desteği içeriyordu.
  • TeX yaygın bilim adamları ve matematikçiler tarafından kullanılan dizgi yazılımı, tüm pozisyon hesaplamaları için 16 fraksiyon bit ile 32 bit ikilik sabit nokta kullanır. Değerler, bir tipografın noktasının kesirleri olarak yorumlanır . TeX yazı tipi metrik dosyaları, 12 kesir biti ile 32 bit işaretli sabit noktalı sayılar kullanır.
  • Tremor , Toast ve MAD sırasıyla Ogg Vorbis , GSM Full Rate ve MP3 ses formatlarını çözen yazılım kütüphaneleridir . Bu kodekler, sabit nokta aritmetiği kullanır çünkü birçok ses kod çözme donanım aygıtında FPU yoktur.
  • Wavpack kayıpsız ses kompresör kullanımları noktası aritmetik sabit. Seçim, diğer şeylerin yanı sıra, farklı donanımlardaki farklı kayan nokta yuvarlama kurallarının sıkıştırmanın kayıpsız doğasını bozabileceği endişesiyle haklıydı.
  • Yuvası Labs Yardımcı kütüphane , sensör numune alma ve sensör çıkışlarının bağlamında bu numaraları ile ilgili özellikle, sabit nokta sayıları için makro ve işlevleri sınırlı bir sağlar.
  • OpenGL ES hep FPU'ya yok gömülü sistemler için amaçlayan bir API olduğu gibi 1.x şartname, sabit bir nokta profilini içerir.
  • DC ve bc programlardır keyfi hassas hesap makineleri, fakat sadece ondalık basamak bir (kullanıcı tarafından belirlenen) sabit sayıda izlemek.
  • Fractint , FPU'su olmayan 386 veya 486SX işlemcili eski PC'lerde çizimi hızlandırmak için sayıları Q2.29 sabit noktalı sayılar olarak temsil eder .
  • Doom , id Software tarafındanharita sistemi, geometri, işleme, oyuncu hareketi vb. dahil olmak üzere tüm tamsayı olmayan hesaplamaları için 16.16 sabit nokta gösterimi kullananson birinci şahıs nişancı oyunuydu. modern Doom kaynak bağlantı noktaları .
  • sabit nokta numaraları bazen görüntüleri ve video karelerini depolamak ve işlemek için kullanılır. Görüntü işlemeye yönelik SIMD birimlerine sahip işlemciler, paketlenmiş sabit nokta verilerini işlemeye uygun talimatlar içerebilir.
  • S # programlama dili Azure kuantum bilgisayarlar uygulamak, kuantum mantık kapıları , sicilleri üzerinde sabit nokta aritmetik gerçekleştirmek için bir standart sayısal kütüphane içerir qubits .

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar