Pada header stdint.h
(C99), boost / cstdint.hpp , dan cstdint
(C ++ 0x) terdapat, antara lain, tipenya int32_t
.
Apakah ada tipe floating point ukuran tetap yang serupa? Sesuatu seperti float32_t
?
Pada header stdint.h
(C99), boost / cstdint.hpp , dan cstdint
(C ++ 0x) terdapat, antara lain, tipenya int32_t
.
Apakah ada tipe floating point ukuran tetap yang serupa? Sesuatu seperti float32_t
?
sizeof
operator. Jenis seperti ini akan berguna saat algoritme mengharuskan ukuran spesifiknya diketahui.
sizeof
digunakan untuk mengatasi masalah jenis mengambang yang menyusun dan tidak menyusun secara konsisten?
Jawaban:
Tidak ada yang seperti ini dalam standar C atau C ++ saat ini. Faktanya, bahkan tidak ada jaminan bahwa float
format floating-point biner sama sekali.
Beberapa kompiler menjamin bahwa float
jenisnya adalah format biner IEEE-754 32 bit. Beberapa tidak. Pada kenyataannya, sebenarnya float
adalah tipe IEEE-754 single
pada sebagian besar platform yang tidak disematkan, meskipun peringatan umum tentang beberapa kompiler yang mengevaluasi ekspresi dalam format yang lebih luas berlaku.
Ada kelompok kerja yang membahas penambahan binding bahasa C untuk revisi 2008 IEEE-754, yang dapat mempertimbangkan untuk merekomendasikan agar typedef tersebut ditambahkan. Jika ini ditambahkan ke C, saya berharap standar C ++ akan mengikuti ... akhirnya.
Jika Anda ingin mengetahui apakah Anda float
adalah tipe IEEE 32-bit, centang std::numeric_limits<float>::is_iec559
. Ini adalah konstanta waktu kompilasi, bukan fungsi.
Jika Anda ingin lebih anti peluru, periksa juga std::numeric_limits<float>::digits
untuk memastikan mereka tidak menggunakan presisi ganda standar IEEE untuk float
. Seharusnya 24.
Dalam hal ini long double
, lebih penting untuk memeriksa digits
karena ada beberapa format IEEE yang mungkin masuk akal: 128 bit (digit = 113) atau 80 bit (digit = 64).
Tidak praktis untuk memilikinya float32_t
karena Anda biasanya ingin menggunakan perangkat keras floating-point, jika tersedia, dan tidak menggunakan implementasi perangkat lunak.
long double
Format pada OS X (32-bit dan 64-bit Intel) adalah persis IEEE-754 ganda diperpanjang format disimpan dalam rangka little-endian. Tidak ada yang funky sama sekali. Byte 0-7 memegang bidang signifikan, dan byte 8 dan 9 memegang bidang eksponen dan tanda.
5.0L
memiliki signifikansi a000000000000000
. Eksponen tidak biasnya adalah +2, dan bias eksponen ganda diperpanjang adalah 3fff
, sehingga eksponen bias untuk 5,0L adalah 4001
. Pola byte sebenarnya ketika disimpan dalam urutan little-endian adalah 00 00 00 00 00 00 00 a0 01 40
, dan jika Anda melihatnya sebagai dua bilangan bulat 64-bit little-endian, Anda akan melihat dengan tepat apa yang Anda amati.
4001
di little-endian adalah 01 40 00 00 ...
Jika tidak ada yang lain, byte yang paling tidak signifikan lebih dulu. Saya berharap urutannya a0 01 40
muncul di suatu tempat dalam nomor (jika mereka hanya melakukan rotasi) tetapi saya tidak berpikir Anda telah menjelaskan mengapa a0
dan 01 40
berada di bagian yang sepenuhnya terpisah.
Jika Anda merasa memiliki typedef seperti float32_t dan float64_t tidak praktis karena alasan apa pun, Anda pasti terlalu terbiasa dengan OS, kompilator, sehingga Anda tidak dapat terlalu melihat ke luar sarang kecil Anda.
Ada perangkat keras yang secara native menjalankan operasi floating point IEEE 32-bit dan lainnya yang melakukan 64-bit. Terkadang sistem seperti itu bahkan harus saling berkomunikasi, dalam hal ini sangat penting untuk mengetahui apakah double adalah 32 bit atau 64 bit pada setiap platform. Jika platform 32-bit akan melakukan perhitungan yang berlebihan berdasarkan pada nilai 64-bit dari yang lain, kami mungkin ingin memasukkan ke presisi yang lebih rendah tergantung pada waktu dan persyaratan kecepatan.
Saya pribadi merasa tidak nyaman menggunakan pelampung dan ganda kecuali saya tahu persis berapa banyak bit yang ada di platfrom saya. Terlebih lagi jika saya mentransfer ini ke platform lain melalui beberapa saluran komunikasi.
Saat ini ada proposal untuk menambahkan jenis berikut ke dalam bahasa:
decimal32
decimal64
decimal128
yang suatu hari nanti dapat diakses melalui #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24
juga perlu membuat hal-hal seperti membaca file wav dengan sampel 24 bit lebih mudah!