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
?
c++
c
boost
floating-point
Pietro
sumber
sumber
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, sebenarnyafloat
adalah tipe IEEE-754single
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.
sumber
Jika Anda ingin mengetahui apakah Anda
float
adalah tipe IEEE 32-bit, centangstd::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 untukfloat
. Seharusnya 24.Dalam hal ini
long double
, lebih penting untuk memeriksadigits
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.sumber
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 signifikansia000000000000000
. Eksponen tidak biasnya adalah +2, dan bias eksponen ganda diperpanjang adalah3fff
, sehingga eksponen bias untuk 5,0L adalah4001
. Pola byte sebenarnya ketika disimpan dalam urutan little-endian adalah00 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 adalah01 40 00 00 ...
Jika tidak ada yang lain, byte yang paling tidak signifikan lebih dulu. Saya berharap urutannyaa0 01 40
muncul di suatu tempat dalam nomor (jika mereka hanya melakukan rotasi) tetapi saya tidak berpikir Anda telah menjelaskan mengapaa0
dan01 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.
sumber
Saat ini ada proposal untuk menambahkan jenis berikut ke dalam bahasa:
yang suatu hari nanti dapat diakses melalui
#include <decimal>
.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
sumber
decimal24
juga perlu membuat hal-hal seperti membaca file wav dengan sampel 24 bit lebih mudah!