Tek duyarlıklı kayan nokta biçimi - Single-precision floating-point format

Tek kesinlikli kayar nokta biçiminde (bazen FP32 veya float32 ) a, bilgisayar numarası formatı , genellikle işgal 32 bit olarak bilgisayar belleği ; kayan bir sayı tabanı noktası kullanarak geniş bir dinamik sayısal değer aralığını temsil eder .

Bir kayan noktalı değişken , kesinlik pahasına aynı bit genişliğindeki sabit noktalı bir değişkenden daha geniş bir sayı aralığını temsil edebilir . Bir imza 32 bit tamsayı değişken 2 bir maksimum değere sahip 31 bir oysa = 2,147,483,647 1 - IEEE 754 (- 2, 2, 32-bit ana-2 kayan nokta değişken bir maksimum değere sahiptir -23 ) x 2 127 ≈ 3.4028235 × 10 38 . 7 veya daha az ondalık basamaklı tüm tamsayılar ve −149 ≤ n ≤ 127 tam sayı için herhangi bir 2 n , tam olarak bir IEEE 754 tek kesinlikli kayan nokta değerine dönüştürülebilir.

Olarak , IEEE 754-2008 standart , 32-bit ana-2 formatı resmi olarak adlandırılır binary32 ; denirdi tek yer IEEE 754-1985 . IEEE 754, 64-bit taban-2 çift ​​kesinlik ve daha yakın zamanda, taban-10 gösterimleri gibi ek kayan nokta türlerini belirtir .

Tek ve çift duyarlıklı kayan noktalı veri türleri sağlayan ilk programlama dillerinden biri Fortran'dı . IEEE 754-1985'in yaygın olarak benimsenmesinden önce, kayan noktalı veri türlerinin gösterimi ve özellikleri bilgisayar üreticisine ve bilgisayar modeline ve programlama dili tasarımcıları tarafından verilen kararlara bağlıydı . Örneğin, GW-BASIC'in tek duyarlıklı veri türü, 32 bit MBF kayan nokta biçimiydi .

Tek hassas olarak adlandırılır GERÇEK içinde Fortran , TEK-FLOAT içinde Common Lisp , şamandıra içinde C , C ++ , C # , Java , Float içinde Haskell ve Swift ve Tek içinde Object Pascal ( Delphi ), Visual Basic ve MATLAB . Ancak, şamandıra içinde Python , Ruby , PHP ve OCaml ve tek sürümleri Octave 3.2 önce atıfta çift duyarlıklı sayılar. Çoğu PostScript uygulamasında ve bazı gömülü sistemlerde desteklenen tek kesinlik tektir.

IEEE 754 tek duyarlıklı ikili kayan nokta biçimi: ikili32

IEEE 754 standardı, bir ikili32'yi aşağıdakilere sahip olarak belirtir :

Bu, 6 ila 9 arasında önemli ondalık basamak hassasiyeti verir. En fazla 6 anlamlı basamağa sahip bir ondalık dize, IEEE 754 tek duyarlıklı gösterime dönüştürülür ve ardından aynı sayıda basamaklı bir ondalık dizeye dönüştürülürse, nihai sonuç orijinal dizeyle eşleşmelidir. Bir IEEE 754 tek kesinlikli sayı, en az 9 anlamlı basamaklı bir ondalık dizgeye dönüştürülür ve ardından tekrar tek duyarlıklı gösterime dönüştürülürse, nihai sonucun orijinal sayıyla eşleşmesi gerekir.

İşaret biti, anlamlının da işareti olan sayının işaretini belirler. Üs, 0 ile 255 arasında, önyargılı biçimde 8 bitlik işaretsiz bir tamsayıdır: 127'lik bir üs değeri gerçek sıfırı temsil eder. Üsler −126 ile +127 arasındadır çünkü −127 (tümü 0'lar) ve +128'in (tümü 1'ler) üsleri özel sayılar için ayrılmıştır.

Gerçek anlamlı, ikili noktanın sağında 23 kesir biti ve üs tüm sıfırlarla birlikte saklanmadıkça 1 değerine sahip örtük bir önde gelen bit (ikili noktanın solunda) içerir. Bu nedenle, sadece 23 parça bit significand bellek biçiminde görünür, ancak toplam hassas (log eşdeğer 24 bittir 10 (2 24 ) ≈ 7,225 ondalık haneli). Bitler aşağıdaki gibi düzenlenir:

Kayan örnek.svg

Belirli bir işaret , yanlı üs e (8 bitlik işaretsiz tam sayı) ve 23 bitlik bir kesir ile belirli bir 32 bitlik ikili32 verisi tarafından kabul edilen gerçek değer

,

hangi verim

Bu örnekte:

  • ,
  • ,
  • ,
  • ,
  • .

Böylece:

  • .

Not:

  • ,
  • ,
  • ,
  • .

Üs kodlaması

Tek duyarlıklı ikili kayan nokta üssü, sıfır ofseti 127 olmak üzere bir ofset-ikili gösterimi kullanılarak kodlanır ; IEEE 754 standardında üs yanlılığı olarak da bilinir.

  • E min = 01 H -7F H = -126
  • E max = FE H -7F H = 127
  • Üs sapması = 7F H = 127

Bu nedenle, ofset-ikili gösterim tarafından tanımlandığı gibi gerçek üssü elde etmek için, 127'nin ofseti, saklanan üstelden çıkarılmalıdır.

Depolanan üsler 00 H ve FF H özel olarak yorumlanır.

Üs kesir = 0 kesir ≠ 0 Denklem
00 H = 00000000 2 ±sıfır normalin altında sayı
01 H , ..., FE , H = 00000001 2 , ..., 11111110 2 normal değer
FF H = 11111111 2 ± sonsuzluk NaN (sessiz, sinyalizasyon)

Minimum pozitif normal değer ve minimum pozitif (normalin altı) değerdir .

Ondalık gösterimden ikili32 biçimine dönüştürme

Genel olarak, gerçek bir sayının eşdeğer ikili32 biçimine katı dönüşümü (yuvarlama davranışı dahil) için IEEE 754 standardının kendisine bakın.

Burada, aşağıdaki taslağı kullanarak 10 tabanlı bir gerçek sayının IEEE 754 ikili32 biçimine nasıl dönüştürüleceğini gösterebiliriz:

  • 12.375 gibi bir tamsayı ve kesir kısmı olan bir gerçek sayı düşünün
  • Dönüştürme ve normalleştirmek içine tamsayı kısmı ikili
  • Kesir kısmını burada gösterildiği gibi aşağıdaki tekniği kullanarak dönüştürün
  • İki sonucu ekleyin ve uygun bir son dönüşüm elde etmek için bunları ayarlayın

Kesirli kısmın dönüştürülmesi: 12.375'in kesirli kısmı olan 0.375'i düşünün. İkili kesre dönüştürmek için kesri 2 ile çarpın, tamsayı kısmını alın ve sıfır kesri bulunana veya IEEE 754 ikili32 formatı için 23 kesir basamağı olan kesinlik sınırına ulaşılana kadar yeni kesir ile 2 ile tekrarlayın. .

, tamsayı kısmı ikili kesir basamağını temsil eder. Devam etmek için 0.750'yi 2 ile tekrar çarpın
, kesir = 0.011, sonlandır

Bunun tam olarak ikili olarak temsil edilebileceğini görüyoruz . Tüm ondalık kesirler, sonlu basamaklı bir ikili kesirde temsil edilemez. Örneğin, ondalık 0,1 ikili olarak tam olarak temsil edilemez, yalnızca yaklaşık olarak temsil edilebilir. Öyleyse:

IEEE yana 754 binary32 biçiminde temsil gerçek değerleri gerektiren biçimi (bakınız Normalize sayısı , Normalleştirilmemiş sayısı ), 1100,011 3 basamak sağa kaydırılır olmak

Sonunda şunu görebiliriz:

Buradan çıkardığımız:

  • Üs 3'tür (ve bu nedenle taraflı biçimde )
  • Kesir 100011'dir (ikili noktanın sağına bakarak)

Bunlardan, 12.375'in ortaya çıkan 32-bit IEEE 754 ikili32 biçim gösterimini oluşturabiliriz:

Not: 68.123'ü IEEE 754 binary32 formatına dönüştürmeyi düşünün: Yukarıdaki prosedürü kullanarak, son 4 bit 1001 olacak şekilde almayı umarsınız . Ancak, IEEE 754 formatının varsayılan yuvarlama davranışı nedeniyle, elde ettiğiniz şey , son 4 biti olan . 1010.

Örnek 1: Ondalık 1'i düşünün. Şunu görebiliriz:

Buradan çıkardığımız:

  • Üs 0'dır (ve bu nedenle önyargılı biçimdedir )
  • Kesir 0'dır (1.0'daki ikili noktanın sağına bakmak hepsidir )

Bunlardan, gerçek sayı 1'in ortaya çıkan 32-bit IEEE 754 ikili32 biçim gösterimini oluşturabiliriz:

Örnek 2: 0.25 değerini düşünün. Bunu görebiliriz:

Buradan çıkardığımız:

  • Üs -2'dir (ve taraflı biçimde )
  • Kesir 0'dır (1.0'daki ikili noktanın sağına bakıldığında hepsi sıfırdır)

Bunlardan, gerçek sayı 0.25'in ortaya çıkan 32-bit IEEE 754 ikili32 biçim gösterimini oluşturabiliriz:

Örnek 3: 0,375 değerini düşünün. bunu gördük

Dolayısıyla, 0.375 temsilini belirledikten sonra yukarıdaki gibi ilerleyebiliriz:

  • Üs -2'dir (ve taraflı biçimde )
  • Kesir 1'dir (1.1'deki ikili noktanın sağına bakmak tektir )

Bunlardan, gerçek sayı 0,375'in ortaya çıkan 32-bit IEEE 754 ikili32 biçim gösterimini oluşturabiliriz:

Tek hassasiyetli örnekler

Bu örnekler, biraz verilmiştir temsil olarak, onaltılı ve ikili kayan nokta değeri. Buna işaret, (önyargılı) üs ve önemli değer dahildir.

0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45
                                                   (smallest positive subnormal number)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38
                                                   (largest subnormal number)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38
                                                   (smallest positive normal number)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038
                                                   (largest normal number)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0.999999940395355225
                                                   (largest number less than one)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (one)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955
                                                   (smallest number larger than one)
1 10000000 000000000000000000000002 = c000 000016 = −2
0 00000000 000000000000000000000002 = 0000 000016 = 0
1 00000000 000000000000000000000002 = 8000 000016 = −0
                                   
0 11111111 000000000000000000000002 = 7f80 000016 = infinity
1 11111111 000000000000000000000002 = ff80 000016 = −infinity
                                   
0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3.14159274101257324 ≈ π ( pi )
0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3
                                   
x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (on x86 and ARM processors)
x 11111111 000000000000000000000012 = ff80 000116 = sNaN (on x86 and ARM processors)

Varsayılan olarak, anlamlıdaki bitlerin çift sayısı nedeniyle, çift ​​duyarlık gibi aşağı yerine 1/3 yukarı yuvarlar . Yuvarlama noktasının ötesindeki 1/3'lük bitler , son sırada1010... bir birimin 1/2'sinden fazla olan bitlerdir .

qNaN ve sNaN kodlamaları IEEE 754'te belirtilmemiştir ve farklı işlemcilerde farklı şekilde uygulanmaktadır. X86 ailesi ve ARM ailesi işlemciler bir sessiz NaN belirtmek için significand alanının en önemli biti kullanır. PA-RISC işlemciler bir sinyal NaN belirtmek için biraz kullanın.

Tek duyarlıklı ikiliden ondalık sayıya dönüştürme

Bu örnekte 41C80000 değerinin onaltılık gösterimiyle başlıyoruz ve onu ikiliye dönüştürüyoruz:

sonra onu üç parçaya ayırırız: işaret biti, üs ve anlamlı.

  • İşaret biti:
  • Üs:
  • önemli:

Daha sonra örtük 24. biti anlamlıya ekliyoruz:

  • önemli:

ve 127'yi çıkararak üs değerinin kodunu çözün:

  • Ham üs:
  • Kodu çözülmüş üs:

Anlamlının 24 bitinin her biri (örtük 24. bit dahil), bit 23'ten bit 0'a, 1'den başlayan bir değeri temsil eder ve her bit için yarılar aşağıdaki gibi:

bit 23 = 1
bit 22 = 0.5
bit 21 = 0.25
bit 20 = 0.125
bit 19 = 0.0625
bit 18 = 0.03125
.
.
bit 0 = 0.00000011920928955078125

Bu örnekteki anlamlı üç bit setine sahiptir: bit 23, bit 22 ve bit 19. Şimdi bu bitler tarafından temsil edilen değerleri ekleyerek anlamlının kodunu çözebiliriz.

  • Kodu çözülmüş önemli:

Ardından, nihai sonucu elde etmek için üssün üssü olan 2 ile çarpmamız gerekir:

Böylece

Bu şuna eşdeğerdir:

burada s işaret biti, x üs ve m anlamlıdır.

[1, 16777216]'daki ondalık değerlerde kesinlik sınırlamaları

  • 1 ile 2 arasındaki ondalık sayılar: 2 −23 sabit aralık (1+2 −23 , 1'den sonraki en büyük kayan noktadır )
  • 2 ile 4 arasındaki ondalık sayılar: sabit aralık 2 −22
  • 4 ile 8 arasındaki ondalık sayılar: sabit aralık 2 −21
  • ...
  • 2 n ile 2 arasındaki ondalık sayılar n+1 : sabit aralık 2 n-23
  • ...
  • 2 22 = 4194304 ve 2 23 =8388608 arasındaki ondalık sayılar: sabit aralık 2 −1 =0.5
  • 2 23 =8388608 ve 2 24 =16777216 arasındaki ondalık sayılar : sabit aralık 2 0 =1

Tamsayı değerlerinde kesinlik sınırlamaları

  • 0 ile 16777216 arasındaki tam sayılar tam olarak gösterilebilir (aynı zamanda -16777216 ile 0 arasındaki negatif tam sayılar için de geçerlidir)
  • 2 24 = 16777216 ile 2 25 =33554432 arasındaki tam sayılar 2'nin katına yuvarlanır (çift sayı)
  • 2 25 ile 2 26 arasındaki tam sayılar 4'ün katına yuvarlanır
  • ...
  • 2 n ile 2 n+1 arasındaki tam sayılar 2 n-23'ün katına yuvarlar
  • ...
  • 2 127 ile 2 128 arasındaki tam sayılar 2 104'ün katına yuvarlanır
  • 2 128'e eşit veya daha büyük tamsayılar "sonsuz" a yuvarlanır.

Optimizasyonlar

Kayan nokta formatının tasarımı , ham bit modelinin tamsayı görünümünden 2 tabanlı logaritma yaklaşımının kolay üretilmesinden kaynaklanan çeşitli optimizasyonlara izin verir . Tamsayı aritmetiği ve bit kaydırma, bilgisayar grafiklerinde yaygın olarak gerekli olan karşılıklı karekök ( hızlı ters karekök ) için bir yaklaşım sağlayabilir .

Ayrıca bakınız

Referanslar

Dış bağlantılar