ในส่วนหัวstdint.h
(C99), boost / cstdint.hppและcstdint
(C ++ 0x) จะมีประเภทint32_t
อื่น ๆ
มีประเภทจุดลอยตัวขนาดคงที่ใกล้เคียงกันหรือไม่? บางอย่างเช่นfloat32_t
?
ในส่วนหัวstdint.h
(C99), boost / cstdint.hppและcstdint
(C ++ 0x) จะมีประเภทint32_t
อื่น ๆ
มีประเภทจุดลอยตัวขนาดคงที่ใกล้เคียงกันหรือไม่? บางอย่างเช่นfloat32_t
?
sizeof
ดำเนินการ ประเภทเช่นนี้จะมีประโยชน์เมื่ออัลกอริทึมกำหนดให้เป็นขนาดเฉพาะที่ทราบ
sizeof
นำมาใช้ในการแก้ปัญหาของการอย่างต่อเนื่องและจัดสรร unmarshalling ประเภทลอยตัว?
คำตอบ:
ไม่มีสิ่งนี้อยู่ในมาตรฐาน C หรือ C ++ ในปัจจุบัน ในความเป็นจริงไม่มีแม้แต่การรับประกันว่าfloat
จะเป็นรูปแบบทศนิยมแบบไบนารีเลย
คอมไพเลอร์บางตัวรับประกันว่าfloat
ประเภทนี้จะเป็นรูปแบบไบนารี IEEE-754 32 บิต บางคนไม่ทำ ในความเป็นจริงfloat
นั้นเป็นประเภท IEEE-754 single
บนแพลตฟอร์มที่ไม่ได้ฝังส่วนใหญ่แม้ว่าจะมีคำเตือนทั่วไปเกี่ยวกับคอมไพเลอร์บางตัวที่ประเมินนิพจน์ในรูปแบบที่กว้างขึ้น
มีคณะทำงานหารือเกี่ยวกับการเพิ่มการผูกภาษา C สำหรับการแก้ไข IEEE-754 ปี 2008 ซึ่งอาจพิจารณาแนะนำให้เพิ่ม typedef ดังกล่าว หากสิ่งนี้ถูกเพิ่มลงใน C ฉันคาดว่ามาตรฐาน C ++ จะเป็นไปตาม ... ในที่สุด
หากคุณต้องการทราบว่าคุณfloat
เป็น IEEE ชนิด 32 std::numeric_limits<float>::is_iec559
บิตตรวจสอบ เป็นค่าคงที่เวลาคอมไพล์ไม่ใช่ฟังก์ชัน
หากคุณต้องการที่จะเป็นกระสุนมากขึ้นนอกจากนี้ยังมีการตรวจสอบstd::numeric_limits<float>::digits
เพื่อให้แน่ใจว่าพวกเขาจะไม่ลอบใช้มาตรฐาน IEEE float
แม่นยำสองสำหรับ มันควรจะเป็น 24
เมื่อพูดถึงlong double
เรื่องนี้สิ่งสำคัญกว่าในการตรวจสอบdigits
เนื่องจากมีรูปแบบ IEEE สองสามรูปแบบซึ่งอาจเป็นได้: 128 บิต (หลัก = 113) หรือ 80 บิต (หลัก = 64)
มันจะไม่เป็นประโยชน์ที่จะมีfloat32_t
เช่นนี้เพราะโดยปกติคุณต้องการใช้ฮาร์ดแวร์ทศนิยมถ้ามีและไม่ต้องถอยกลับไปใช้งานซอฟต์แวร์
long double
รูปแบบใน OS X (ทั้งแบบ 32 บิตและ 64 บิต Intel) เป็นว่ารูปแบบการขยาย IEEE-754 คู่เก็บไว้ในการสั่งซื้อน้อย endian ไม่มีอะไรขี้ขลาดเลย ไบต์ 0-7 ถือฟิลด์สำคัญและไบต์ 8 และ 9 ถือฟิลด์เลขชี้กำลังและเครื่องหมาย
5.0L
a000000000000000
ตัวแทนที่เป็นกลางของมันคือ 2 และคู่อคติตัวแทนขยาย3fff
เพื่อให้ตัวแทนลำเอียงสำหรับ 5.0L 4001
เป็น รูปแบบไบต์ที่แท้จริงเมื่อจัดเก็บในลำดับที่น้อยที่สุดคือ00 00 00 00 00 00 00 a0 01 40
และถ้าคุณมองว่าเป็นจำนวนเต็ม 64 บิตแบบ endian ตัวน้อยสองตัวคุณจะเห็นสิ่งที่คุณสังเกตได้
4001
ใน little-endian คือ01 40 00 00 ...
ถ้าไม่มีอะไรอื่นไบต์ที่มีนัยสำคัญน้อยที่สุดมาก่อน ฉันคาดว่าลำดับa0 01 40
จะปรากฏที่ใดที่หนึ่งในตัวเลข (หากพวกเขาทำการหมุนเวียนเท่านั้น) แต่ฉันไม่คิดว่าคุณอธิบายสาเหตุa0
และ01 40
อยู่ในช่วงครึ่งปีที่แยกจากกันโดยสิ้นเชิง
หากคุณคิดว่ามี typedefs เช่น float32_t และ float64_t ไม่สามารถใช้งานได้ไม่ว่าด้วยเหตุผลใดก็ตามคุณต้องคุ้นเคยกับระบบปฏิบัติการคอมไพเลอร์ที่คุ้นเคยมากเกินไปจนไม่สามารถมองออกไปนอกรังเล็ก ๆ ของคุณได้
มีฮาร์ดแวร์ที่รันการดำเนินการจุดลอยตัว IEEE 32 บิตและอื่น ๆ ที่ทำ 64 บิต บางครั้งระบบดังกล่าวยังต้องคุยกับอีกฝ่ายซึ่งในกรณีนี้สิ่งสำคัญอย่างยิ่งที่จะต้องทราบว่าคู่คือ 32 บิตหรือ 64 บิตในแต่ละแพลตฟอร์ม หากแพลตฟอร์ม 32 บิตต้องทำการคำนวณมากเกินไปบนพื้นฐานของค่า 64 บิตจากค่าอื่นเราอาจต้องการแคสต์ให้มีความแม่นยำต่ำลงโดยขึ้นอยู่กับข้อกำหนดด้านเวลาและความเร็ว
โดยส่วนตัวแล้วฉันรู้สึกไม่สบายใจกับการลอยตัวและเพิ่มเป็นสองเท่าเว้นแต่ฉันจะรู้ว่ามีกี่บิตบนแท่นวางของฉัน ยิ่งไปกว่านั้นถ้าฉันจะโอนสิ่งเหล่านี้ไปยังแพลตฟอร์มอื่นผ่านช่องทางการสื่อสารบางช่อง
ขณะนี้มีข้อเสนอให้เพิ่มประเภทต่อไปนี้ลงในภาษา:
decimal32
decimal64
decimal128
#include <decimal>
ซึ่งอาจจะเป็นวันหนึ่งที่สามารถเข้าถึงได้ผ่านทาง
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24
เช่นกันเพื่อทำให้สิ่งต่างๆเช่นการอ่านไฟล์ wav ด้วยตัวอย่าง 24 บิตง่ายขึ้น!