Mengapa C tidak memiliki float yang tidak ditandatangani?

131

Saya tahu, pertanyaannya sepertinya aneh. Pemrogram terkadang berpikir terlalu banyak. Silakan baca terus ...

Dalam penggunaan CI signeddan unsignedbilangan bulat banyak. Saya suka fakta bahwa kompiler memperingatkan saya jika saya melakukan hal-hal seperti menugaskan integer yang ditandatangani ke variabel yang tidak ditandatangani. Saya mendapat peringatan jika saya bandingkan ditandatangani dengan bilangan bulat yang tidak ditandatangani dan banyak lagi.

Saya suka peringatan ini. Mereka membantu saya menjaga kode saya tetap benar.

Mengapa kita tidak memiliki kemewahan yang sama untuk kendaraan hias? Root kuadrat pasti tidak akan pernah mengembalikan angka negatif. Ada juga tempat lain di mana nilai float negatif tidak memiliki arti. Kandidat sempurna untuk pelampung tanpa tanda tangan.

Btw - Saya tidak terlalu tertarik dengan sedikit presisi tambahan yang bisa saya dapatkan dengan menghapus bit tanda dari pelampung. Saya sangat senang dengan floatmereka seperti sekarang. Saya hanya ingin menandai float sebagai unsigned terkadang dan mendapatkan peringatan yang sama dengan yang saya dapatkan dengan bilangan bulat.

Saya tidak mengetahui adanya bahasa pemrograman yang mendukung angka floating-point yang tidak ditandatangani.

Adakah yang tahu mengapa mereka tidak ada?


EDIT:

Saya tahu bahwa FPU x87 tidak memiliki instruksi untuk menangani float yang tidak ditandatangani. Mari kita gunakan instruksi float yang sudah ditandatangani. Penyalahgunaan (mis. Menjadi di bawah nol) dapat dianggap sebagai perilaku yang tidak terdefinisi dengan cara yang sama dengan overflow bilangan bulat yang ditandatangani tidak ditentukan.

Nils Pipenbrinck
sumber
4
Menarik, dapatkah Anda memposting contoh kasus di mana penandatanganan typechecking bermanfaat?
litb, apakah komentar Anda ditujukan kepada saya? jika demikian, saya tidak mendapatkannya
Iraimbilanja yeah :) fabs tidak dapat mengembalikan angka negatif, karena itu mengembalikan nilai absolut argumennya
Johannes Schaub - litb
Benar. Saya tidak bertanya bagaimana suatu hipotesis tanpa tanda kutip dapat membantu kesempurnaan. Apa yang saya tanyakan adalah: dalam situasi apa pipenbrinck menemukan bahwa penginstalan jenis huruf Intan membantu (mengarahkannya untuk mencari mekanisme yang sama untuk mengapung). berkaitan dengan typesafety
1
Ada optimasi mikro yang tidak ditandatangani untuk pemeriksaan point-in-range: ((unsigned) (p-min)) <(maks-mnt), yang hanya memiliki satu cabang, tetapi, seperti biasa, yang terbaik adalah profil untuk melihat apakah itu sangat membantu (saya kebanyakan menggunakannya pada 386 core jadi saya tidak tahu bagaimana CPU modern mengatasinya).
Skizz

Jawaban:

114

Mengapa C ++ tidak memiliki dukungan untuk float yang tidak ditandatangani adalah karena tidak ada operasi kode mesin yang setara untuk dijalankan oleh CPU. Jadi akan sangat tidak efisien untuk mendukungnya.

Jika C ++ mendukungnya, maka Anda terkadang menggunakan float yang tidak ditandatangani dan tidak menyadari bahwa kinerja Anda baru saja terbunuh. Jika C ++ mendukungnya maka setiap operasi floating point perlu diperiksa untuk melihat apakah ditandatangani atau tidak. Dan untuk program yang melakukan jutaan operasi floating point, ini tidak dapat diterima.

Jadi pertanyaannya adalah mengapa pelaksana perangkat keras tidak mendukungnya. Dan saya pikir jawabannya adalah tidak ada standar float unsigned yang didefinisikan pada awalnya. Karena bahasa ingin kompatibel ke belakang, meskipun bahasa itu ditambahkan tidak dapat memanfaatkannya. Untuk melihat spesifikasi floating point, Anda harus melihat pada standar IEEE 754 Floating-Point .

Anda dapat menghindari tidak memiliki tipe titik mengambang unsigned dengan membuat kelas float unsigned yang merangkum float atau double dan melempar peringatan jika Anda mencoba untuk memasukkan angka negatif. Ini kurang efisien, tetapi mungkin jika Anda tidak menggunakannya secara intensif, Anda tidak akan peduli dengan sedikit kehilangan kinerja.

Saya pasti melihat manfaat memiliki pelampung tanpa tanda tangan. Tetapi C / C ++ cenderung memilih efisiensi yang paling baik untuk semua orang daripada keamanan.

Brian R. Bondy
sumber
17
C / C ++ tidak memerlukan operasi kode mesin khusus untuk mengimplementasikan bahasa. Kompiler C / C ++ awal dapat menghasilkan kode titik apung untuk 386 - CPU tanpa FPU! Kompiler akan menghasilkan panggilan perpustakaan untuk meniru instruksi FPU. Oleh karena itu, ufloat dapat dilakukan tanpa dukungan CPU
Skizz
10
Skizz, sementara itu benar, Brian sudah membahas ini - bahwa karena tidak ada kode mesin yang setara, kinerjanya akan mengerikan dengan perbandingan.
Anthony
2
@ Brian R. Bondy: Saya kehilangan Anda di sini: "karena tidak ada operasi kode mesin yang setara untuk dijalankan oleh CPU ...". Bisakah Anda jelaskan secara sederhana?
Lazer
2
Alasan OP menginginkan dukungan untuk float yang tidak ditandatangani adalah untuk pesan peringatan, jadi sebenarnya itu tidak ada hubungannya dengan fase pembuatan kode dari kompiler - hanya berkaitan dengan bagaimana pengecekan jenis itu dilakukan sebelumnya - jadi dukungan untuk mereka dalam kode mesin tidak relevan dan (seperti yang telah ditambahkan ke bagian bawah pertanyaan) instruksi floating point normal dapat digunakan untuk eksekusi aktual.
Joe F
2
Saya tidak yakin saya mengerti mengapa ini harus memengaruhi kinerja. Sama seperti dengan int's, semua pengecekan terkait tanda dapat terjadi pada waktu kompilasi. OP menyarankan bahwa unsigned floatakan dilaksanakan secara teratur floatdengan pemeriksaan waktu kompilasi untuk memastikan bahwa operasi tidak berarti tertentu tidak pernah dilakukan. Kode dan kinerja mesin yang dihasilkan bisa identik, terlepas dari apakah float Anda ditandatangani atau tidak.
xanderflood
14

Ada perbedaan yang signifikan antara bilangan bulat ditandatangani dan tidak ditandatangani dalam C / C ++:

value >> shift

nilai yang ditandatangani membiarkan bit atas tidak berubah (sign extended), nilai yang tidak ditandatangani menghapus bit atas.

Alasan tidak ada float yang tidak ditandatangani adalah bahwa Anda dengan cepat mengalami semua jenis masalah jika tidak ada nilai negatif. Pertimbangkan ini:

float a = 2.0f, b = 10.0f, c;
c = a - b;

Nilai apa yang dimiliki c? -8. Tapi apa artinya itu dalam sistem tanpa angka negatif. FLOAT_MAX - 8 mungkin? Sebenarnya, itu tidak berfungsi sebagai FLOAT_MAX - 8 adalah FLOAT_MAX karena efek presisi sehingga segala sesuatu menjadi lebih edan. Bagaimana jika itu adalah bagian dari ekspresi yang lebih kompleks:

float a = 2.0f, b = 10.0f, c = 20.0f, d = 3.14159f, e;
e = (a - b) / d + c;

Ini bukan masalah untuk bilangan bulat karena sifat sistem komplemen 2's.

Juga pertimbangkan fungsi matematika standar: sin, cos dan tan hanya akan bekerja untuk setengah nilai input mereka, Anda tidak dapat menemukan log nilai <1, Anda tidak bisa menyelesaikan persamaan kuadrat: x = (-b +/- root ( bb - 4.ac)) / 2.a, dan sebagainya. Bahkan, itu mungkin tidak akan berfungsi untuk fungsi kompleks karena ini cenderung diimplementasikan sebagai perkiraan polinomial yang akan menggunakan nilai negatif di suatu tempat.

Jadi, pelampung tanpa tanda tidak berguna.

Tapi itu tidak berarti mengatakan bahwa kelas yang rentang memeriksa nilai float tidak berguna, Anda mungkin ingin menjepit nilai ke rentang yang diberikan, misalnya perhitungan RGB.

Mendesis
sumber
@ Skizz: jika representasi adalah masalah, maksud Anda jika seseorang dapat menemukan metode untuk menyimpan float yang seefisien 2's complement, tidak akan ada masalah dengan memiliki float yang tidak ditandatangani?
Lazer
3
value >> shift for signed values leave the top bit unchanged (sign extend) Apa kamu yakin akan hal itu? Saya pikir itu adalah perilaku yang ditentukan implementasi, setidaknya untuk nilai yang ditandatangani negatif.
Dan
@ Dan: Hanya melihat standar baru-baru ini dan memang menyatakan bahwa itu adalah implementasi didefinisikan - Saya kira itu hanya dalam kasus ada CPU yang tidak memiliki hak bergeser dengan tanda memperpanjang instruksi.
Skizz
1
floating point secara tradisional jenuh (ke - / + Inf) alih-alih membungkus. Anda mungkin berharap overflow pengurangan unsigned jenuh 0.0, atau mungkin Inf atau NaN. Atau hanya Perilaku yang Tidak Terdefinisi, seperti OP yang disarankan dalam edit pertanyaan. Re: trig functions: jadi jangan mendefinisikan versi input tanpa tanda sindan sebagainya, dan pastikan untuk memperlakukan nilai pengembaliannya sebagai ditandatangani. Pertanyaannya bukan mengusulkan mengganti float dengan float unsigned, hanya menambahkan unsigned floatsebagai tipe baru.
Peter Cordes
9

(Sebagai tambahan, Perl 6 memungkinkan Anda menulis

subset Nonnegative::Float of Float where { $_ >= 0 };

dan kemudian Anda dapat menggunakan Nonnegative::Floatseperti halnya jenis lainnya.)

Tidak ada dukungan perangkat keras untuk operasi floating point yang tidak ditandatangani, jadi C tidak menawarkannya. C sebagian besar dirancang untuk menjadi "rakitan portabel", yaitu, sedekat mungkin dengan logam tanpa terikat ke platform tertentu.

[sunting]

C seperti perakitan: apa yang Anda lihat adalah persis apa yang Anda dapatkan. Sebuah implisit "Saya akan memeriksa bahwa pelampung ini tidak negatif untuk Anda" bertentangan dengan filosofi desainnya. Jika Anda benar-benar menginginkannya, Anda dapat menambahkan assert(x >= 0)atau serupa, tetapi Anda harus melakukannya secara eksplisit.

singkat
sumber
svn.perl.org/parrot/trunk/languages/perl6/docs/STATUS mengatakan ya, tetapi of ...tidak diuraikan.
ephemient
8

Saya percaya int unsigned dibuat karena kebutuhan untuk margin nilai yang lebih besar daripada yang ditandatangani int dapat menawarkan.

Float memiliki margin yang jauh lebih besar, sehingga tidak pernah ada kebutuhan 'fisik' untuk float yang tidak ditandatangani. Dan ketika Anda menunjukkan diri Anda dalam pertanyaan Anda, tambahan 1 bit presisi bukanlah apa-apa untuk membunuh.

Sunting: Setelah membaca jawaban oleh Brian R. Bondy , saya harus mengubah jawaban saya: Dia pasti benar bahwa CPU yang mendasarinya tidak memiliki operasi float yang tidak ditandatangani. Namun, saya mempertahankan keyakinan saya bahwa ini adalah keputusan desain berdasarkan alasan yang saya nyatakan di atas ;-)

Treb
sumber
2
Juga, penambahan dan pengurangan bilangan bulat adalah titik mengambang yang ditandatangani atau tidak ditandatangani yang sama, tidak terlalu banyak. Siapa yang akan melakukan pekerjaan ekstra untuk mendukung pelampung yang ditandatangani dan tidak ditandatangani mengingat utilitas marginal yang relatif rendah dari fitur tersebut?
ephemient
7

Saya pikir Treb ada di jalur yang benar. Ini lebih penting untuk bilangan bulat bahwa Anda memiliki tipe korespondensi yang tidak ditandatangani. Itu adalah yang digunakan dalam bit-shifting dan digunakan dalam bit-maps . Sedikit tanda masuk ke jalan. Misalnya, menggeser-kanan nilai negatif, nilai yang dihasilkan adalah implementasi yang didefinisikan dalam C ++. Melakukan hal itu dengan integer yang tidak ditandatangani atau meluap seperti itu memiliki semantik yang terdefinisi dengan sempurna karena tidak ada yang menghalangi.

Jadi untuk bilangan bulat setidaknya, kebutuhan untuk tipe unsigned yang terpisah lebih kuat dari sekedar memberikan peringatan. Semua poin di atas tidak perlu dipertimbangkan untuk mengapung. Jadi, menurut saya, tidak ada kebutuhan nyata untuk dukungan perangkat keras untuk mereka, dan C sudah tidak mendukung mereka pada saat itu.

Johannes Schaub - litb
sumber
5

Root kuadrat pasti tidak akan pernah mengembalikan angka negatif. Ada juga tempat lain di mana nilai float negatif tidak memiliki arti. Kandidat sempurna untuk pelampung tanpa tanda tangan.

C99 mendukung bilangan kompleks, dan tipe umum dari sqrt, jadi sqrt( 1.0 * I)akan negatif.


Para komentator menyoroti sedikit gloss di atas, karena saya merujuk pada sqrtmakro tipe-generik daripada fungsi, dan itu akan mengembalikan nilai floating point skalar dengan memotong kompleks ke komponen sebenarnya:

#include <complex.h>
#include <tgmath.h>

int main () 
{
    complex double a = 1.0 + 1.0 * I;

    double f = sqrt(a);

    return 0;
}

Ini juga berisi kentut-otak, karena bagian nyata dari sqrt dari setiap bilangan kompleks adalah positif atau nol, dan sqrt (1.0 * I) adalah sqrt (0.5) + sqrt (0.5) * I not -1.0.

Pete Kirkham
sumber
Ya, tetapi Anda memanggil suatu fungsi dengan nama yang berbeda jika Anda bekerja dengan bilangan kompleks. Juga tipe pengembaliannya berbeda. Poin yang bagus!
Nils Pipenbrinck
4
Hasil dari sqrt (i) adalah bilangan kompleks. Dan karena bilangan kompleks tidak dipesan, Anda tidak dapat mengatakan bilangan kompleks adalah negativ (yaitu <0)
quinmars
1
quinmars, yakin itu bukan csqrt? atau apakah Anda berbicara tentang matematika, bukan C? saya setuju pula bahwa itu adalah titik yang baik :)
Johannes Schaub - litb
Memang, saya berbicara tentang matematika. Saya tidak pernah berurusan dengan bilangan kompleks dalam c.
quinmars
1
"akar kuadrat pasti tidak akan pernah mengembalikan angka negatif." -> sqrt(-0.0)sering menghasilkan -0.0. Tentu saja -0,0 bukan nilai negatif .
chux - Reinstate Monica
4

Saya kira itu tergantung pada spesifikasi floating-point IEEE saja yang ditandatangani dan sebagian besar bahasa pemrograman menggunakannya.

Artikel Wikipedia tentang angka-angka floating-point IEEE-754

Sunting: Juga, seperti dicatat oleh orang lain, sebagian besar perangkat keras tidak mendukung pelampung non-negatif, sehingga jenis pelampung yang normal lebih efisien untuk dilakukan karena ada dukungan perangkat keras.

Tobias Wärre
sumber
C diperkenalkan jauh sebelum standar IEEE-754 muncul
phuclv
@ phuclv Tidak ada perangkat keras floating point yang biasa. Itu diadopsi ke dalam standar C "beberapa" tahun kemudian. Mungkin ada beberapa dokumentasi yang beredar di internet tentang hal itu. (Juga, artikel wikipedia menyebutkan C99).
Tobias Wärre
Saya tidak mengerti maksud Anda. Tidak ada "perangkat keras" dalam jawaban Anda, dan IEEE-754 lahir setelah C, jadi tipe floating-point dalam C tidak dapat bergantung pada standar IEEE-754, kecuali jenis-jenis itu diperkenalkan ke dalam C lebih belakangan
phuclv
@ phuclv C adalah / juga dikenal sebagai perakitan portabel, sehingga bisa sangat dekat dengan perangkat keras. Bahasa mendapatkan fitur selama bertahun-tahun, bahkan jika float (sebelum waktu saya) diimplementasikan dalam C, itu mungkin operasi berbasis perangkat lunak dan cukup mahal. Pada saat menjawab pertanyaan ini, saya jelas memiliki pemahaman yang lebih baik tentang apa yang saya coba jelaskan daripada yang saya lakukan sekarang. Dan jika Anda melihat jawaban yang diterima Anda mungkin mengerti mengapa saya menyebutkan standar IEE754. Apa yang saya tidak mengerti adalah bahwa Anda memilih jawaban 10 tahun yang bukan jawaban yang diterima?
Tobias Wärre
3

Saya pikir alasan utama adalah bahwa pelampung tanpa tanda akan memiliki kegunaan yang benar-benar terbatas dibandingkan dengan int unsigned. Saya tidak membeli argumen bahwa itu karena perangkat keras tidak mendukungnya. Prosesor yang lebih tua tidak memiliki kemampuan floating point sama sekali, itu semua ditiru dalam perangkat lunak. Jika float yang tidak ditandatangani bermanfaat, mereka akan diimplementasikan dalam perangkat lunak terlebih dahulu dan perangkat keras akan mengikutinya.

Ferruccio
sumber
4
PDP-7, platform pertama C, memiliki unit floating point perangkat keras opsional. PDP-11, platform C berikutnya, memiliki perangkat keras 32-bit. 80x86 datang satu generasi kemudian, dengan beberapa teknologi yang merupakan generasi di belakang.
ephemient
3

Tipe integer yang tidak ditandai dalam C didefinisikan sedemikian rupa untuk mematuhi aturan cincin aljabar abstrak. Misalnya, untuk nilai X dan Y apa pun, menambahkan XY ke Y akan menghasilkan X. Jenis integer yang tidak ditandatangani dijamin untuk mematuhi aturan-aturan ini dalam semua kasus yang tidak melibatkan konversi ke atau dari jenis numerik lainnya [atau jenis tanpa tanda ukuran berbeda] , dan jaminan itu adalah salah satu fitur terpenting dari jenis-jenis tersebut. Dalam beberapa kasus, ada baiknya melepaskan kemampuan untuk mewakili angka negatif dengan imbalan jaminan tambahan yang hanya bisa diberikan oleh tipe yang tidak bertanda tangan. Tipe floating-point, apakah ditandatangani atau tidak, tidak dapat mematuhi semua aturan cincin aljabar [misalnya mereka tidak dapat menjamin bahwa X + YY akan sama dengan X], dan memang IEEE tidak bahkan tidak memungkinkan mereka untuk mematuhi aturan kelas kesetaraan [dengan mengharuskan nilai-nilai tertentu dibandingkan tidak setara dengan diri mereka sendiri]. Saya tidak berpikir tipe floating-point "unsigned" dapat mematuhi aksioma yang tidak bisa dilakukan oleh tipe floating-point, jadi saya tidak yakin apa kelebihan yang ditawarkannya.

supercat
sumber
1

IHMO itu karena mendukung tipe floating-point yang ditandatangani dan tidak ditandatangani baik dalam perangkat keras maupun perangkat lunak akan terlalu merepotkan

Untuk tipe integer kita dapat memanfaatkan yang sama logika unit untuk kedua operasi integer ditandatangani dan unsigned dalam kebanyakan situasi menggunakan properti yang bagus komplemen 2, karena hasilnya identik dalam kasus-kasus untuk add, sub, non-pelebaran mul dan kebanyakan operasi bitwise. Untuk operasi yang membedakan antara versi yang ditandatangani dan yang tidak ditandatangani, kami masih dapat berbagi sebagian besar logika . Sebagai contoh

  • Pergeseran aritmatika dan logis hanya perlu sedikit perubahan pada filler untuk bit teratas
  • Penggandaan pelebaran dapat menggunakan perangkat keras yang sama untuk bagian utama dan kemudian beberapa logika terpisah untuk menyesuaikan hasil untuk mengubah signness . Bukan berarti itu digunakan dalam pengganda nyata tetapi mungkin dilakukan
  • Perbandingan yang ditandatangani dapat dikonversi menjadi perbandingan yang tidak ditandatangani dan sebaliknya dengan mudah dengan mengganti bit teratas atau menambahkanINT_MIN . Secara teoritis juga mungkin, mungkin tidak digunakan pada perangkat keras, namun ini berguna pada sistem yang hanya mendukung satu jenis perbandingan (seperti 8080 atau 8051)

Sistem yang menggunakan komplemen 1 juga hanya perlu sedikit modifikasi pada logika karena itu hanya membawa sedikit melilit ke bit yang paling signifikan. Tidak yakin tentang sistem sign-magnitude tetapi sepertinya mereka menggunakan komplemen 1 secara internal sehingga hal yang sama berlaku

Sayangnya kami tidak begitu mewah untuk tipe floating-point. Dengan hanya membebaskan bit tanda kita akan memiliki versi yang tidak ditandatangani. Tapi untuk apa kita menggunakan bit itu?

  • Tingkatkan kisaran dengan menambahkannya ke eksponen
  • Tingkatkan presisi dengan menambahkannya ke mantissa. Ini seringkali lebih bermanfaat, karena kita umumnya membutuhkan lebih banyak ketelitian daripada jangkauan

Tetapi kedua pilihan membutuhkan penambah yang lebih besar untuk mengakomodasi rentang nilai yang lebih luas. Itu meningkatkan kompleksitas logika sementara bit atas penambah duduk di sana sebagian besar tidak digunakan. Lebih banyak sirkuit akan diperlukan untuk perkalian, divisi atau operasi kompleks lainnya

Pada sistem yang menggunakan perangkat lunak titik-mengambang, Anda memerlukan 2 versi untuk setiap fungsi yang tidak diharapkan selama memori sangat mahal, atau Anda harus menemukan beberapa cara "rumit" untuk berbagi bagian dari fungsi yang ditandatangani dan tidak ditandatangani.

Namun perangkat keras floating-point sudah ada jauh sebelum C ditemukan , jadi saya percaya pilihan dalam C adalah karena kurangnya dukungan perangkat keras karena alasan yang saya sebutkan di atas

Yang mengatakan, ada beberapa format floating-point unsigned khusus , terutama untuk keperluan pemrosesan gambar, seperti tipe floating-point 10 dan 11-bit Khronos group

phuclv
sumber
0

Saya menduga itu karena prosesor dasar yang ditargetkan oleh kompiler C tidak memiliki cara yang baik untuk menangani angka floating point yang tidak ditandatangani.

Brian Ensink
sumber
Apakah prosesor yang mendasari memiliki cara yang baik untuk berurusan dengan angka floating-point yang ditandatangani? C menjadi populer ketika prosesor bantu floating-point istimewa dan hampir tidak universal.
David Thornley
1
Saya tidak tahu semua jadwal waktu bersejarah tetapi ada dukungan perangkat keras yang muncul untuk pelampung yang ditandatangani, meskipun jarang seperti yang Anda tunjukkan. Desainer bahasa dapat menggabungkan dukungan untuk itu sementara backend compiler memiliki berbagai tingkat dukungan tergantung pada arsitektur yang ditargetkan.
Brian Ensink
0

Pertanyaan bagus.

Jika, seperti yang Anda katakan, itu hanya untuk peringatan waktu kompilasi dan tidak ada perubahan dalam perilaku mereka sebaliknya maka perangkat keras yang mendasarinya tidak terpengaruh dan karena itu hanya akan menjadi perubahan C ++ / Compiler.

Saya telah memenangkan yang sama sebelumnya, tetapi masalahnya adalah: Itu tidak akan banyak membantu. Paling-paling kompiler dapat menemukan tugas statis.

unsigned float uf { 0 };
uf = -1f;

Atau lebih lama secara minimalis

unsigned float uf { 0 };
float f { 2 };
uf -= f;

Tapi itu saja. Dengan tipe integer yang tidak ditandatangani, Anda juga mendapatkan sampul yang ditentukan, yaitu berperilaku seperti aritmatika modular.

unsigned char uc { 0 };
uc -= 1;

setelah ini 'uc' memiliki nilai 255.

Sekarang, apa yang akan dilakukan oleh kompiler dengan skenario yang sama dengan tipe float-unsigned? Jika nilainya tidak diketahui pada waktu kompilasi, ia perlu menghasilkan kode yang pertama-tama mengeksekusi perhitungan dan kemudian melakukan tanda-cek. Tetapi bagaimana ketika hasil dari perhitungan seperti itu akan mengatakan "-5.5" - nilai mana yang harus disimpan dalam float yang dinyatakan tidak ditandatangani? Orang dapat mencoba aritmatika modular seperti untuk tipe integral, tetapi itu datang dengan masalah sendiri: Nilai terbesar adalah tak terhingga tak terhingga .... itu tidak bekerja, Anda tidak dapat memiliki "tak terhingga - 1". Pergi untuk nilai berbeda terbesar yang bisa dipegang juga tidak akan benar-benar berfungsi karena di sana Anda mengalami precisi. "NaN" akan menjadi kandidat.

Terakhir ini tidak akan menjadi masalah dengan nomor titik tetap karena ada modulo yang didefinisikan dengan baik.

ABaumstumpf
sumber