Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Direct3D çeşitli kayan nokta gösterimlerini destekler. Tüm kayan nokta hesaplamaları, IEEE 754 32 bit tek duyarlıklı kayan nokta kurallarının tanımlanmış bir alt kümesi altında çalışır.
32-bit kayan nokta kuralları
İki kural kümesi vardır: IEEE-754'e uyanlar ve standarttan sapanlar.
IEEE-754 kurallarına riayet edildi
Bu kurallardan bazıları, IEEE-754'ün seçenekler sunduğu tek bir seçenektir.
0'a bölün, 0/0 dışında +/- INF üretir ve bu da NaN sonucunu verir.
(+/-) 0'ın logaritması -INF üretir.
Negatif bir değerin (-0dışında) logaritması NaN üretir.
Negatif bir sayının ters karekökü (rsq) veya karekökü (sqrt) NaN üretir.
Özel durum -0'dır; sqrt(-0) -0, rsq(-0) ise -INF üretir.
INF - INF = NaN
(+/-)INF / (+/-)INF = NaN
(+/-)INF * 0 = NaN
NaN (herhangi bir OP) herhangi bir değer = NaN
İşlenenlerden biri veya her ikisi de NaN olduğunda EQ, GT, GE, LT ve LE karşılaştırmaları FALSEdöndürür.
Karşılaştırmalar 0 işaretini yoksayar (dolayısıyla +0 -0eşittir).
NE karşılaştırması, işlenenlerden biri veya her ikisi de NaN olduğunda TRUEdöndürür.
NaN olmayan herhangi bir değerin +/- INF ile karşılaştırmaları doğru sonucu verir.
IEEE-754 kurallarından sapmaları veya ek gereksinimleri
IEEE-754, sonsuz hassas bir sonuca en yakın temsil edilebilir değer olan ve en yakın çifte yuvarlama olarak bilinen bir sonuç üretmek için kayan nokta işlemleri gerektirir.
Direct3D 11 ve yukarısı, IEEE-754 ile aynı gereksinimi tanımlar: 32 bit kayan nokta işlemleri, sonsuz hassas sonucun 0,5 birim son yeri (ULP) içinde bir sonuç üretir. Bu, örneğin, donanımın sonuçları en yakın çifte yuvarlamak yerine 32 bit olarak kesmesine izin verildiği anlamına gelir; bu durumda, en fazla 0,5 ULP'lik bir hata olur. Bu kural yalnızca toplama, çıkarma ve çarpma için geçerlidir.
Direct3D'nin önceki sürümleri IEEE-754'ten daha gevşek bir gereksinim tanımlar: 32 bit kayan nokta işlemleri, sonsuz hassas sonucun bir birim son yerinde (1 ULP) olan bir sonuç üretir. Bu, örneğin donanımın sonuçları en yakın çifte yuvarlamak yerine 32 bit olarak kesmesine izin verildiği anlamına gelir, çünkü bu, en fazla bir ULP hatasına neden olur.
Kayan nokta istisnaları, durum bitleri veya tuzaklar için destek yoktur.
Denorm'lar, herhangi bir kayan nokta matematiksel işleminin girişinde ve çıkışında, işaret korunarak sıfıra indirgenir. Verileri işlemeyen herhangi bir G/Ç veya veri taşıma işlemi için istisnalar yapılmaktadır.
Viewport MinDepth/MaxDepth veya BorderColor değerleri gibi kayan nokta değerleri içeren durumlar, denorm değerleri olarak sağlanabilir ve donanım bunları kullanmadan önce temizlenebilir veya boşaltılamayabilir.
Minimum veya maksimum işlemler karşılaştırma için denormal sayıları temizler, ancak sonuç denormal olarak temizlenmiş olabilir veya olmayabilir.
Bir işleme naN girişi her zaman çıkışta NaN üretir. Ancak NaN'nin tam bit deseninin aynı kalması gerekmez (işlem verileri değiştirmeyen ham taşıma yönergesi olmadığı sürece).)
Yalnızca bir işlenenin NaN olduğu en küçük veya en büyük işlemler sonuç olarak diğer işleneni döndürür (daha önce incelediğimiz karşılaştırma kurallarının aksine). Bu bir IEEE 754R kuralıdır.
Kayan nokta min ve max işlemleri için IEEE-754R belirtimi, min veya max girişlerinden biri sessiz bir QNaN değeriyse işlemin sonucunun diğer parametre olduğunu belirtir. Örneğin:
min(x,QNaN) == min(QNaN,x) == x (same for max)IEEE-754R standardının bir değişikliği, bir giriş "sinyal veren" SNaN değeri ve QNaN değeri olduğunda min ve max için farklı bir davranışı benimsedi.
min(x,SNaN) == min(SNaN,x) == QNaN (same for max)Direct3D genellikle aritmetik standartları izler: IEEE-754 ve IEEE-754R. Ama bu durumda bir sapmamız var.
Direct3D 10 ve sonraki sürümlerdeki aritmetik kurallar sessiz ve sinyal NaN değerleri (QNaN ve SNaN) arasında ayrım yapmaz. Tüm NaN değerleri aynı şekilde işlenir. Min ve max gibi durumlarda, herhangi bir NaN değeri için Direct3D davranışı, QNaN'ın IEEE-754R tanımında nasıl işleneceğini gösterir. (Tamlık için - her iki giriş de NaN ise, herhangi bir NaN değeri döndürülür.)
Başka bir IEEE 754R kuralı, işareti göz önünde bulundurur: min(-0,+0) == min(+0,-0) == -0 ve max(-0,+0) == max(+0,-0) == +0'dır. Bu, imzalı sıfır karşılaştırma kurallarının aksine (daha önce gördüğümüz gibi) gerçekleşir. Direct3D burada IEEE 754R davranışını önerir, ancak zorlamaz; sıfırları karşılaştırmanın sonucunun, işaretleri yok sayan bir karşılaştırma kullanarak parametrelerin sırasına bağımlı olmasına izin verilebilir.
x*1.0f her zaman x ile sonuçlanır (denorm boşaltılmış hariç).
x/1.0f her zaman x ile sonuçlanır (denormlar hariç tutulduğunda).
x +/- 0,0f her zaman x ile sonuçlanır (denorm boşaltılmış hariç). Ancak -0 + 0 = +0.
Birleşik işlemler (mad, dp3 gibi), işlemin birleşik olmayan genişlemesinin sıralamalı değerlendirilmesinden kaynaklanan en kötü olası doğruluk seviyesinden daha az doğru sonuçlar üretmez. Tolerans amacıyla mümkün olan en kötü sıralamanın tanımı, belirli bir kaynaştırılmış işlem için sabit bir tanım değildir; girişlerin belirli değerlerine bağlıdır. Her bir açılım adımına 1 ULP toleransı verilir (ya da Direct3D'nin 1 ULP'den daha gevşek toleransa sahip olarak belirttiği tüm yönergeler için daha gevşek toleransa izin verilir).
Birleştirilmiş işlemler, birleştirilmemiş operasyonlar ile aynı NaN kurallarına uyar.
sqrt ve rcp'nin 1 ULP toleransı vardır. Gölgelendiricinin rcp ve rsqtalimatları, kendi ayrı gevşek duyarlık gereksinimlerine sahiptir.
Çarpma ve bölme işlemi 32 bit kayan nokta hassasiyet düzeyinde çalışır (çarpma için 0,5 ULP, ters için 1,0 ULP doğruluk düzeyinde). x/y doğrudan uygulanırsa, sonuçlar iki aşamalı bir yöntemden daha yüksek veya eşit doğrulukta olmalıdır.
64 bit (çift duyarlıklı) kayan nokta kuralları
Donanım ve görüntü sürücüleri isteğe bağlı olarak çift duyarlıklı kayan noktayı destekler. Desteği belirtmek için, ID3D11Device::CheckFeatureSupport fonksiyonunu D3D11_FEATURE_DOUBLESile çağırdığınızda, sürücü, D3D11_FEATURE_DATA_DOUBLES içinde yer alan DoublePrecisionFloatShaderOps değerini TRUE olarak ayarlar. Ardından sürücü ve donanım tüm çift duyarlıklı kayan nokta yönergelerini desteklemelidir.
Çift duyarlıklı yönergeler IEEE 754R davranış gereksinimlerini izler.
Çift duyarlıklı veriler için (sıfırla sonuçlanma davranışı olmaksızın) denormalize edilmiş değerlerin oluşturulması adına destek gereklidir. Benzer şekilde, yönergeler denormalize edilmiş verileri imzalı sıfır olarak okumaz, denorm değerine saygı duyar.
16 bit kayan nokta kurallarını
Direct3D, kayan noktalı sayıların 16 bit gösterimini de destekler.
Biçim:
- MSB bit konumunda 1 işaret biti
- 5 bitlik önyargılı üstel (e)
- 10 bitlik kesir (f) ve bir ek gizli bit içeren
Float16 değeri (v) şu kurallara uyar:
- e == 31 ve f != 0 ise, s'ye bakılmaksızın v NaN olur
- e == 31 ve f == 0 ise, v = (-1)s*sonsuz (imzalı sonsuz)
- e 0 ile 31 arasındaysa v = (-1)s*2(e-15)*(1.f)
- e == 0 ve f != 0 ise, v = (-1)s*2(e-14)*(0.f) (denormalize sayılar)
- e == 0 ve f == 0 ise, v = (-1)s*0 (imzalı sıfır)
32 bit kayan nokta kuralları, daha önce açıklanan bit düzeni için ayarlanmış 16 bit kayan noktalı sayılar için de geçerlidir. Bunun istisnaları şunlardır:
- Duyarlık: 16 bit kayan noktalı sayılarda erimemiş işlemler, sonsuz hassasiyete sahip bir sonuca en yakın temsil edilebilir değer olan bir sonuç üretir (16 bit değerlere uygulanan IEEE-754 standardına göre en yakın çifte yuvarlama). 32 bit kayan nokta kuralları 1 ULP toleransı, 16 bit kayan nokta kuralları, kararsız işlemler için 0,5 ULP ve kaynaştırılmış işlemler için 0,6 ULP'ye bağlıdır.
- 16 bit kayan noktalı sayılar, denormları korur.
11 bit ve 10 bit kayan nokta kurallarını
Direct3D ayrıca 11 bit ve 10 bit kayan nokta biçimlerini de destekler.
Biçim:
- İşaret biti bulunmuyor
- 5 bitlik önyargılı üstel (e)
- 11 bitlik format için 6 bitlik kesir (f), 10 bitlik format için 5 bitlik kesir (f), her iki formatta da ek bir gizli bit vardır.
Float11/float10 değeri (v) aşağıdaki kurallara uyar:
- e == 31 ve f != 0 ise, v NaN olur
- e == 31 ve f == 0 ise, v = +sonsuz
- e 0 ile 31 arasındaysa v = 2(e-15)*(1.f)
- e == 0 ve f != 0 ise, v = *2(e-14)*(0.f) (normalleştirilmiş sayılar)
- e == 0 ve f == 0 ise, v = 0 (sıfır)
32 bit kayan nokta kuralları, daha önce açıklanan bit düzeni için ayarlanmış 11 bit ve 10 bit kayan noktalı sayılar için de geçerlidir. Özel durumlar şunlardır:
- Kesinlik: 32 bit kayan nokta kuralları 0,5 ULP'ye bağlıdır.
- 10 ve 11 bit kayan noktalı sayılar, denormal sayıları korur.
- Sıfırdan küçük bir sayıyla sonuçlanan tüm işlemler sıfıra sıkıştırılır.
İlgili konular