Bagikan melalui


Aturan titik mengambang (Direct3D 11)

Direct3D 11 mendukung beberapa representasi floating-point. Semua komputasi floating-point beroperasi di bawah subset yang ditentukan dari aturan floating-point presisi tunggal IEEE 754 32-bit.

Aturan 32-bit floating-point

Ada dua set aturan: yang sesuai dengan IEEE-754, dan yang menyimpang dari standar.

Aturan IEEE-754 ditaati

Beberapa aturan ini adalah satu opsi di mana IEEE-754 menawarkan pilihan.

  • Dibagi dengan 0 menghasilkan +/- INF, kecuali 0/0 yang menghasilkan NaN.
  • Logaritma (+/-) 0 hasilnya adalah -INF. log nilai negatif (selain -0) menghasilkan NaN.
  • Akar kuadrat timbal balik (rsq) atau akar kuadrat (sqrt) dari angka negatif menghasilkan NaN. Pengecualiannya adalah -0; sqrt(-0) menghasilkan -0, dan rsq(-0) menghasilkan -INF.
  • INF - INF = NaN
  • (+/-)INF / (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (OP apa pun) nilai apa pun = NaN
  • Perbandingan EQ, GT, GE, LT, dan LE, ketika salah satu atau kedua operan adalah NaN, akan mengembalikan FALSE.
  • Perbandingan mengabaikan tanda 0 (sehingga +0 sama dengan -0).
  • Perbandingan NE, ketika salah satu atau kedua operan adalah NaN, mengembalikan TRUE.
  • Perbandingan nilai non-NaN terhadap +/- INF mengembalikan hasil yang benar.

Penyimpangan atau persyaratan tambahan dari aturan IEEE-754

  • IEEE-754 memerlukan operasi floating-point untuk menghasilkan hasil yang merupakan nilai terdekat yang dapat diwakili dengan hasil yang tak terbatas-tepat, yang dikenal sebagai round-to-nearest-even. Direct3D 11 mendefinisikan persyaratan yang sama: operasi floating-point 32-bit menghasilkan hasil yang berada dalam 0,5 unit tempat terakhir (ULP) dari hasil dengan presisi tak terbatas. Ini berarti bahwa, misalnya, perangkat keras diizinkan untuk memotong hasil menjadi 32-bit daripada melakukan pembulatan ke nearest-even, karena hal itu akan mengakibatkan kesalahan paling banyak sebesar 0,5 ULP. Aturan ini hanya berlaku untuk penambahan, pengurangan, dan perkalian.

  • Tidak ada dukungan untuk pengecualian floating-point, bit status, atau perangkap.

  • Angka denormal diubah menjadi nol dengan mempertahankan tanda pada input dan output dari setiap operasi matematika floating-point. Pengecualian dibuat untuk setiap I/O atau operasi pergerakan data yang tidak memanipulasi data.

  • Status yang berisi nilai floating-point, seperti Viewport MinDepth/MaxDepth, nilai BorderColor, dapat disediakan sebagai nilai denorm dan mungkin atau mungkin tidak dihapus sebelum perangkat keras menggunakannya.

  • Operasi min atau maks membersihkan bilangan denormal untuk perbandingan, tetapi hasilnya mungkin atau mungkin tidak dibersihkan dari bilangan denormal.

  • Input NaN ke operasi selalu menghasilkan NaN pada output. Tetapi pola bit yang tepat dari NaN tidak harus tetap sama (kecuali operasinya adalah instruksi pemindahan langsung - yang tidak mengubah data.)

  • Operasi minimum atau maksimum yang hanya memiliki satu operand sebagai NaN akan mengembalikan operand lainnya sebagai hasilnya (bertentangan dengan aturan perbandingan yang kita lihat sebelumnya). Ini adalah aturan IEEE 754R.

    Aturan aritmatika dalam Direct3D 10 dan yang lebih baru tidak membuat perbedaan antara nilai NaN "tenang" dan "sinyal" (QNaN vs SNaN). Semua nilai "NaN" ditangani dengan cara yang sama.

  • Jika kedua input ke min() atau max() adalah NaN, maka NaN apa pun dikembalikan.

  • Aturan IEEE 754R adalah min(-0,+0) == min(+0,-0) == -0, dan max(-0,+0) == max(+0,-0) == +0; yang menghormati tanda. Itu berbeda dengan aturan perbandingan yang dinyatakan di atas untuk nol bertanda. Direct3D 11 merekomendasikan perilaku IEEE 754R di sini, tetapi tidak memberlakukannya; dimungkinkan bagi hasil perbandingan nol untuk bergantung pada urutan parameter, dengan menggunakan perbandingan yang mengabaikan tanda.

  • x*1.0f selalu menghasilkan x (kecuali denormal yang dihapus).

  • x/1.0f selalu menghasilkan x (kecuali denorm yang dibersihkan).

  • x +/- 0,0f selalu menghasilkan x (kecuali angka denormalisasi dibersihkan). Tapi -0 + 0 = +0.

  • Operasi gabungan (seperti mad, dp3) menghasilkan hasil yang tidak kurang akurat daripada kemungkinan serial terburuk dari evaluasi ekspansi operasi gabungan yang tidak difusi. Definisi pengurutan terburuk yang dimungkinkan, untuk tujuan toleransi, bukan definisi tetap untuk operasi gabungan; itu tergantung pada nilai spesifik dari input. Langkah-langkah individu dalam ekspansi yang tidak disatukan masing-masing diberikan toleransi 1 ULP (atau untuk instruksi mana pun yang dipanggil Direct3D dengan toleransi yang lebih laks daripada 1 ULP, toleransi yang lebih laks tersebut diperbolehkan).

  • Operasi terfusi mengikuti aturan NaN yang sama seperti operasi yang tidak terfusi.

  • sqrt dan rcp memiliki toleransi 1 ULP. Instruksi timbal balik dan akar kuadrat terbalik, rcp dan rsq, memiliki persyaratan presisi relaksasi yang terpisah dan spesifik.

  • Operasi perkalian dan pembagian masing-masing dilakukan pada tingkat presisi floating-point 32-bit (akurasi hingga 0,5 ULP untuk mengalikan, 1,0 ULP untuk pembagian). Jika x/y diimplementasikan secara langsung, hasil harus lebih besar atau sama akurasinya daripada metode dua langkah.

Aturan poin mengambang 64-bit (presisi ganda)

Driver perangkat keras dan tampilan secara opsional mendukung floating-point presisi ganda. Untuk menunjukkan dukungan, ketika Anda memanggil ID3D11Device::CheckFeatureSupport dengan D3D11_FEATURE_DOUBLES, driver akan mengatur DoublePrecisionFloatShaderOps dari D3D11_FEATURE_DATA_DOUBLES ke TRUE. Driver dan perangkat keras perlu mendukung semua instruksi floating-point dengan presisi ganda.

Instruksi presisi ganda mengikuti persyaratan perilaku IEEE 754R.

Dukungan untuk pembuatan nilai denormalisasi diperlukan untuk data presisi ganda (tidak ada perilaku flush-to-zero). Demikian juga, instruksi tidak membaca data denormalisasi sebagai nol bertanda, melainkan menghormati nilai denorm.

Aturan floating-point 16-bit

Direct3D 11 juga mendukung representasi angka floating-point 16-bit.

Format:

  • 1 bit tanda (s) pada posisi bit MSB
  • 5 bit eksponen bias (e)
  • 10 bit pecahan (f), dengan tambahan bit tersembunyi

Nilai float16 (v) mengikuti aturan berikut:

  • jika e == 31 dan f != 0, maka v adalah NaN terlepas dari s
  • jika e == 31 dan f == 0, maka v = (-1)s*infinity (tak terbatas yang ditandatangani)
  • jika e adalah antara 0 dan 31, maka v = (-1)s*2(e-15)*(1.f)
  • jika e == 0 dan f != 0, maka v = (-1)s*2(e-14)*(0.f) (angka denormalisasi)
  • jika e == 0 dan f == 0, maka v = (-1)s*0 (nol bertanda)

Aturan floating-point 32-bit juga berlaku untuk angka floating-point 16-bit, disesuaikan untuk tata letak bit yang telah dijelaskan sebelumnya. Pengecualian untuk ini meliputi:

  • Presisi: Operasi yang tidak digabungkan pada angka floating-point 16-bit menghasilkan nilai yang dapat diwakili terdekat dengan hasil yang berpresisi tak terhingga (dibulatkan ke terdekat genap, sesuai standar IEEE-754, diterapkan pada nilai 16-bit). Aturan floating-point 32-bit mematuhi toleransi 1 ULP, aturan floating-point 16-bit mematuhi 0.5 ULP untuk operasi yang tidak menyatu, dan 0.6 ULP untuk operasi yang menyatu.
  • Angka floating-point 16-bit mempertahankan angka non-norm.

Aturan 11-bit dan 10-bit floating-point

Direct3D 11 juga mendukung format floating-point 11-bit dan 10-bit.

Format:

  • Tidak ada bit tanda
  • 5 bit eksponen bias (e)
  • 6 bit pecahan (f) untuk format 11-bit, 5 bit pecahan (f) untuk format 10-bit, dengan bit tersembunyi tambahan dalam kedua kasus.

Nilai float11/float10 (v) mengikuti aturan berikut:

  • jika e == 31 dan f != 0, maka v adalah NaN
  • jika e == 31 dan f == 0, maka v = +infinity
  • jika e adalah antara 0 dan 31, maka v = 2(e-15)*(1.f)
  • jika e == 0 dan f != 0, maka v = *2(e-14)*(0.f) (angka denormalisasi)
  • jika e == 0 dan f == 0, maka v = 0 (nol)

Aturan floating-point 32-bit juga berlaku untuk angka floating-point 11-bit dan 10-bit, dengan penyesuaian pada tata letak bit yang dijelaskan sebelumnya. Pengecualian meliputi:

  • Presisi: Aturan floating-point 32-bit mengikuti 0,5 ULP.
  • Angka floating-point 10/11-bit mempertahankan angka denormal.
  • Setiap operasi yang hasilnya lebih kecil dari nol dibatasi menjadi nol.

Sumber Daya

Tekstur