Çift duyarlıklı kayan nokta biçimi - Double-precision floating-point format

Çift duyarlıklı kayan nokta biçimi (bazen FP64 veya float64 olarak adlandırılır ) , genellikle bilgisayar belleğinde 64 bit kaplayan bir bilgisayar sayı biçimidir ; kayan bir sayı tabanı noktası kullanarak geniş bir dinamik sayısal değerler aralığını temsil eder .

Kayan nokta, kesirli değerleri temsil etmek için veya sabit nokta (aynı bit genişliğinde) tarafından sağlanandan daha geniş bir aralık gerektiğinde , hassasiyet pahasına olsa bile kullanılır. Aralığı veya hassas olduğunda çift hassas seçilebilir bir hassas yetersiz olacaktır.

Olarak , IEEE 754-2008 standart 64-bit ana-2 formatı resmi olarak adlandırılır binary64 ; denirdi çift de IEEE 754-1985 . IEEE 754, 32-bit taban-2 tek kesinlik ve daha yakın zamanda, taban-10 gösterimleri dahil olmak üzere ek kayan nokta biçimlerini 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 uygulayıcıları tarafından alınan kararlara bağlıydı . Örneğin, GW-BASIC'in çift ​​duyarlıklı veri türü 64 bit MBF kayan nokta biçimiydi .

IEEE 754 çift duyarlıklı ikili kayan nokta biçimi: binary64

Çift duyarlıklı ikili kayan nokta, performansı ve bant genişliği maliyetine rağmen, tek duyarlıklı kayan noktaya göre daha geniş aralığı nedeniyle PC'lerde yaygın olarak kullanılan bir formattır. Genellikle basitçe double olarak bilinir . IEEE 754 standardı, bir ikili64'ü aşağıdakilere sahip olarak belirtir :

İşaret biti, sayının işaretini belirler (bu sayının sıfır olduğu, imzalı olduğu zaman dahil ).

Üs alanı, önyargılı biçimde 0 ile 2047 arasında 11 bitlik işaretsiz bir tamsayıdır: 1023'lük bir üs değeri gerçek sıfırı temsil eder. Üsler -1022 ile +1023 arasındadır çünkü -1023 (tümü 0'lar) ve +1024'ün (tümü 1'ler) üsleri özel sayılar için ayrılmıştır.

53 bitlik anlamlılık hassasiyeti, 15 ila 17 arasında anlamlı ondalık basamak hassasiyeti (2 −53  ≈ 1,11 × 10 −16 ) verir. En fazla 15 anlamlı basamak içeren bir ondalık dize, IEEE 754 çift duyarlıklı gösterime dönüştürülür ve ardından aynı basamak sayısına sahip bir ondalık dizeye dönüştürülürse, nihai sonuç orijinal dizeyle eşleşmelidir. Bir IEEE 754 çift kesinlikli sayı, en az 17 anlamlı basamak içeren bir ondalık dizgeye dönüştürülür ve ardından tekrar çift duyarlıklı gösterime dönüştürülürse, nihai sonucun orijinal sayıyla eşleşmesi gerekir.

Biçim, 1 değerinde örtük bir tamsayı bitine sahip olan anlamlı ile yazılır (özel veriler dışında, aşağıdaki üs kodlamasına bakın). Anlamlı kesrin (F) 52 biti bellek formatında göründüğünden, toplam kesinlik 53 bittir (yaklaşık 16 ondalık basamak, 53 log 10 (2) ≈ 15.955). Bitler aşağıdaki gibi düzenlenir:

IEEE 754 Çift Kayan Nokta Formatı.svg

Belirli bir önyargılı üs ve 52 bitlik bir kesir ile belirli bir 64-bit çift kesinlik verisi tarafından kabul edilen gerçek değer ,

veya

2 52 =4,503,599,627,370.496 ve 2 53 =9,007,199,254,740,992 arasında gösterilebilir sayılar tam sayılardır. 2 53 ile 2 54 arasındaki sonraki aralık için , her şey 2 ile çarpılır, bu nedenle temsil edilebilir sayılar çift sayılardır, vb. Tersine, 2 51 ila 2 52 arasındaki önceki aralık için aralık 0,5'tir, vb.

2 n - 2 n +1 aralığındaki sayıların kesri olarak boşluk 2 n -52'dir . Bu nedenle , bir sayıyı temsil edilebilir en yakın sayıya ( makine epsilon ) yuvarlarken maksimum göreli yuvarlama hatası 2 −53'tür .

Üssün 11 bit genişliği, 10 −308 ile 10 308 arasındaki sayıların tam 15–17 ondalık basamak hassasiyetiyle temsiline izin verir . Kesinlikten ödün vererek, normal altı gösterim yaklaşık 5 × 10 −324'e kadar daha küçük değerlere izin verir .

Üs kodlaması

Çift duyarlıklı ikili kayan nokta üssü, sıfır ofseti 1023 olmak üzere bir ofset-ikili gösterimi kullanılarak kodlanır ; IEEE 754 standardında üs yanlılığı olarak da bilinir. Bu tür temsillere örnekler:

e = = =1: 00000000001200116 ( normal sayılar için en küçük üs )
e = = = 1023: 0111111111123ff16 (sıfır ofset)
e = = =1029: 10000000101240516
e = = =2046: 1111111111027fe16 (en yüksek üs)

Üsler ve özel bir anlamı vardır: 000167ff16

  • 000000000002= işaretli bir sıfırı (eğer F = 0 ise) ve alt normalleri (eğer F ≠ 0 ise ) temsil etmek için kullanılır ; ve00016
  • 111111111112= , (eğer F = 0 ise) ve NaN'leri (eğer F ≠ 0 ise ) temsil etmek için kullanılır ,7ff16

burada F , anlamın kesirli kısmıdır . Tüm bit desenleri geçerli kodlamadır.

Yukarıdaki istisnalar dışında, çift kesinlikli sayının tamamı şu şekilde tanımlanır:

Alt normaller ( e = 0) durumunda çift kesinlik sayısı şu şekilde tanımlanır:

endianness

Günümüzün her yerde bulunan x86 işlemcileri, tüm veri türleri (tamsayı, kayan nokta) için küçük endian depolama kullansa da, tam sayıların küçük olarak temsil edildiği kayan noktalı sayıların büyük endian biçiminde temsil edildiği bir dizi donanım mimarisi vardır. endian formu. Orada ARM hem 32 bit kelime tamsayı kayıtları gibi küçük endian saklanır, ama önce en önemli tek: Çift duyarlıklı sayılar için yarım küçük endian, yarım big-endian kayan nokta temsil hakkına sahip işlemciler. Onlar için " " standart gösterimi olmayan birçok kayan nokta formatı olduğundan, XDR standardı, temsili olarak big-endian IEEE 754'ü kullanır. Bu nedenle, yaygın IEEE 754 kayan nokta standardının endianness belirtmemesi garip görünebilir . Teorik olarak bu, bir makine tarafından yazılan standart IEEE kayan nokta verilerinin bile başka bir makine tarafından okunamayabileceği anlamına gelir. Bununla birlikte, modern standart bilgisayarlarda (yani, IEEE 754'ün uygulanması), pratikte endianlığın, tamsayılar için olduğu gibi kayan noktalı sayılar için aynı olduğu varsayılabilir, bu da veri türünden bağımsız olarak dönüşümü basit hale getirir. ( Ancak, özel kayan nokta formatlarını kullanan küçük gömülü sistemler başka bir konu olabilir.)

VAX kayan nokta, küçük endian 16 bit kelimeleri büyük endian düzende saklar.

Çift hassasiyetli örnekler

0 01111111111 0000000000000000000000000000000000000000000000000000 2 ≙ 3FF0 0000 0000 0000 16 ≙ +2 0 × 1 = 1
0 01111111111 00000000000000000000000000000000000000000000000000001 2 ≙ 3FF0 0000 0000 0001 16 ≙ +2 0 × (1 + 2 −52 ) ≈ 1.0000000000000002, en küçük sayı > 1
0 01111111111 0000000000000000000000000000000000000000000000000010 2 ≙ 3FF0 0000 0000 0002 16 ≙ +2 0 × (1 + 2 −51 ) ≈ 1.0000000000000004
0 100000000000 0000000000000000000000000000000000000000000000000000 2 ≙ 4000 0000 0000 0000 16 ≙ +2 1 × 1 = 2
1 10000000000 0000000000000000000000000000000000000000000000000000 2 ≙ C000 0000 0000 0000 16 ≙ −2 1 × 1 = −2
0 100000000000 1000000000000000000000000000000000000000000000000000 2 ≙ 4008 0000 0000 0000 16 ≙ +2 1 × 1.1 2 = 11 2 = 3
0 10000000001 0000000000000000000000000000000000000000000000000000 2 ≙ 4010 0000 0000 0000 16 ≙ +2 2 × 1 = 100 2 = 4
0 10000000001 01000000000000000000000000000000000000000000000000000 2 ≙ 4014 0000 0000 0000 16 ≙ +2 2 × 1.01 2 = 101 2 = 5
0 10000000001 1000000000000000000000000000000000000000000000000000 2 ≙ 4018 0000 0000 0000 16 ≙ +2 2 × 1.1 2 = 110 2 = 6
0 10000000011 01110000000000000000000000000000000000000000000000000000 2 ≙ 4037 0000 0000 0000 16 ≙ +2 4 × 1.0111 2 = 10111 2 = 23
0 01111111000 1000000000000000000000000000000000000000000000000000 2 ≙ 3F88 0000 0000 0000 16 ≙ +2 −7 × 1.1 2 = 0.00000011 2 = 0.01171875 (3/256)
0 00000000000 0000000000000000000000000000000000000000000000000001 2 ≙ 0000 0000 0000 0001 16 ≙ + 2 -1022 x 2 -52 = 2 -1074 ≈ 4,9406564584124654 x 10 -324 (min. Normal altı çift pozitif)
0 00000000000 1111111111111111111111111111111111111111111111111111 2 ≙ 000F FFFF FFFF FFFF 16 ≙ + 2 -1022 x (1-2 -52 ) ≈ 2,2250738585072009 x 10 -308 (En normal altı çift.)
0 00000000001 0000000000000000000000000000000000000000000000000000 2 ≙ 0010 0000 0000 0000 16 ≙ + 2 -1022 x 1 ≈ 2,2250738585072014 x 10 -308 (min., Normal çift pozitif)
0 11111111110 11111111111111111111111111111111111111111111111111111 2 ≙ 7FEF FFFF FFFF FFFF 16 ≙ +2 1023 × (1 + (1 − 2 −52 )) ≈ 1.7976931348623157 × 10 308 (Maks. Çift)
0 000000000000 0000000000000000000000000000000000000000000000000000 2 ≙ 0000 0000 0000 0000 16 ≙ +0
1 000000000000 0000000000000000000000000000000000000000000000000000 2 ≙ 8000 0000 0000 0000 16 ≙ −0
0 11111111111 0000000000000000000000000000000000000000000000000000 2 ≙ 7FF0 0000 0000 0000 16 ≙ +∞ (pozitif sonsuz)
1 11111111111 0000000000000000000000000000000000000000000000000000 2 ≙ FFF0 0000 0000 0000 16 ≙ −∞ (negatif sonsuz)
0 11111111111 00000000000000000000000000000000000000000000000000001 2 ≙ 7FF0 0000 0000 0001 16 ≙ NaN (x86 ve ARM gibi çoğu işlemcide sNaN)
0 11111111111 10000000000000000000000000000000000000000000000000001 2 ≙ 7FF8 0000 0000 0001 16 ≙ NaN (x86 ve ARM gibi çoğu işlemcide qNaN)
0 11111111111 11111111111111111111111111111111111111111111111111111 2 ≙ 7FFF FFFF FFFF FFFF 16 ≙ NaN (NaN'nin alternatif bir kodlaması)
0 01111111101 010101010101010101010101010101010101010101010101 2 = 3FD5 5555 5555 5555 16 ≙ +2 −2 × (1 + 2 −2 + 2 −4 + ... + 2 −52 ) ≈ 1 / 3
0 10000000000 1001001000011111101101010100010001000010110100011000 2 = 4009 21FB 5444 2D18 16 ≈ pi

qNaN ve sNaN kodlamaları IEEE 754'te tam olarak belirtilmemiştir ve işlemciye bağlıdır. x86 ailesi ve ARM ailesi işlemcileri gibi çoğu işlemci, sessiz bir NaN belirtmek için önemli alanının en önemli bitini kullanır; IEEE 754 tarafından önerilen budur. PA-RISC işlemcileri, bir NaN sinyalini belirtmek için biti kullanır.

Varsayılan olarak, 1 / 3 gibi detaylı kadar aşağı mermi, bir hassasiyet nedeniyle significand bitlerin sayısının tek.

Daha ayrıntılı olarak:

Given the hexadecimal representation 3FD5 5555 5555 555516,
  Sign = 0
  Exponent = 3FD16 = 1021
  Exponent Bias = 1023 (constant value; see above)
  Fraction = 5 5555 5555 555516
  Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here
        = 2−2 × (15 5555 5555 555516 × 2−52)
        = 2−54 × 15 5555 5555 555516
        = 0.333333333333333314829616256247390992939472198486328125
        ≈ 1/3

Çift duyarlıklı aritmetik ile yürütme hızı

Çift duyarlıklı kayan noktalı değişkenleri ve matematiksel işlevleri (örneğin, sin, cos, atan2, log, exp ve sqrt) kullanmak, tek duyarlıklı karşılıklarıyla çalışmaktan daha yavaştır. Bunun belirli bir sorun olduğu bir bilgi işlem alanı, GPU'larda çalışan paralel koddur. Kullanırken Örneğin, NVIDIA'nın sitesindeki CUDA bir donanımına bağlı olarak bir platform, çift hassas almak ile hesaplamalar, uzun olarak yaklaşık 2 ila 32 kat kullanılarak yapılır kıyasla tamamlamak üzere, tek bir hassasiyet .

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

  • -2 53 ila 2 53 (−9,007,199,254,740,992 ila 9,007,199,254,740,992) arasındaki tam sayılar tam olarak temsil edilebilir
  • 2 53 ile 2 54 arasındaki tam sayılar = 18,014,398,509,481,984 2'nin katına yuvarlanır (çift sayı)
  • 2 54 ile 2 55 arasındaki tam sayılar = 36,028,797,018,963,968 4'ün katına yuvarlanır

Uygulamalar

Çiftler, birçok programlama dilinde aşağıdaki gibi farklı şekillerde uygulanır. Gibi yalnızca dinamik hassasiyetle işlemciler, Açık x86 olmadan SSE2 (veya SSE2, uyumluluk amacıyla kullanılmadığında) ve varsayılan olarak kullanılan genişletilmiş hassasiyetle, yazılım bazı şartları yerine getirmek için zorluklar olabilir.

C ve C++

C ve C++ çok çeşitli aritmetik türleri sunar . Standartlar tarafından çift hassasiyet gerekli değildir ( IEEE 754 aritmetiğini kapsayan C99'un isteğe bağlı eki F hariç ), ancak çoğu sistemde, doubletip çift hassasiyete karşılık gelir. Ancak, varsayılan olarak genişletilmiş hassasiyete sahip 32-bit x86'da, bazı derleyiciler C standardına uymayabilir veya aritmetik çift ​​yuvarlamadan zarar görebilir .

Fortran

Fortran , birkaç tamsayı ve gerçek tür sağlar ve real64Fortran'ın içsel modülü aracılığıyla erişilebilen 64 bitlik tür , iso_fortran_envçift ​​kesinliğe karşılık gelir.

Ortak Lisp

Common Lisp , SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT ve LONG-FLOAT türlerini sunar. Çoğu uygulama, SINGLE-FLOAT'ları ve DOUBLE-FLOAT'ları diğer uygun eşanlamlı türlerle birlikte sağlar. Common Lisp, IEEE 754'e göre kayan noktalı alt ve taşmaların ve tam olmayan kayan nokta istisnasının yakalanması için istisnalar sağlar. ANSI standardında hiçbir sonsuzluk ve NaN açıklanmaz, ancak bazı uygulamalar bunları uzantı olarak sağlar.

Java

On Java sürümü 1.2 önce, her uygulama IEEE 754 uyumlu olması gerekiyordu. Sürüm 1.2, uygulamaların x87 gibi platformlar için ara hesaplamalarda ekstra hassasiyet getirmesine izin verdi . Bu nedenle , katı IEEE 754 hesaplamalarını zorlamak için bir strictfp değiştiricisi tanıtıldı. Java 17'de katı kayan nokta geri yüklendi.

JavaScript

ECMAScript standardı tarafından belirtildiği gibi , JavaScript'teki tüm aritmetik, çift ​​duyarlıklı kayan nokta aritmetiği kullanılarak yapılacaktır.

Ayrıca bakınız

  • IEEE 754 , kayan nokta aritmetiği için IEEE standardı

Notlar ve referanslar