Trong stdint.h
(C99), boost / cstdint.hpp vàcstdint
(C ++ 0x), có loại int32_t
.
Có các loại dấu phẩy động có kích thước cố định tương tự không? Một cái gì đó như thế float32_t
nào?
Trong stdint.h
(C99), boost / cstdint.hpp vàcstdint
(C ++ 0x), có loại int32_t
.
Có các loại dấu phẩy động có kích thước cố định tương tự không? Một cái gì đó như thế float32_t
nào?
sizeof
toán tử. Loại như thế này sẽ hữu ích khi một thuật toán yêu cầu nó phải có kích thước cụ thể đã biết.
sizeof
được sử dụng để giải quyết vấn đề của các loại thả nổi và không quản lý nhất quán?
Câu trả lời:
Không có gì như thế này tồn tại trong các tiêu chuẩn C hoặc C ++ hiện tại. Trên thực tế, thậm chí không có gì đảm bảo rằng đó float
sẽ là một định dạng dấu phẩy động nhị phân.
Một số trình biên dịch đảm bảo rằng float
kiểu sẽ là định dạng nhị phân 32 bit IEEE-754. Một số không. Trên thực tế, thực tế float
là loại IEEE-754 single
trên hầu hết các các nền tảng không nhúng, mặc dù áp dụng các cảnh báo thông thường về một số trình biên dịch đánh giá biểu thức ở định dạng rộng hơn.
Có một nhóm làm việc thảo luận về việc bổ sung các ràng buộc ngôn ngữ C cho bản sửa đổi năm 2008 của IEEE-754, nhóm có thể xem xét đề xuất rằng nên thêm một typedef như vậy. Nếu điều này được thêm vào C, tôi hy vọng tiêu chuẩn C ++ sẽ tuân theo ... cuối cùng.
Nếu bạn muốn biết liệu của bạn có phải float
là loại IEEE 32-bit hay không, hãy kiểm tra std::numeric_limits<float>::is_iec559
. Đó là một hằng số thời gian biên dịch, không phải là một hàm.
Nếu bạn muốn chống đạn tốt hơn, hãy kiểm tra std::numeric_limits<float>::digits
để đảm bảo rằng chúng không lén lút sử dụng độ chính xác kép tiêu chuẩn IEEE cho float
. Nó phải là 24.
Khi nói đến long double
, điều quan trọng hơn là phải kiểm tra digits
vì có một số định dạng IEEE mà nó có thể là hợp lý: 128 bit (chữ số = 113) hoặc 80 bit (chữ số = 64).
Sẽ không thực tế nếu có float32_t
như vậy vì bạn thường muốn sử dụng phần cứng dấu phẩy động, nếu có và không phải quay lại triển khai phần mềm.
long double
định dạng trên OS X (cả 32-bit và 64-bit Intel) là chính xác IEEE-754 đôi định dạng mở rộng lưu trữ theo thứ tự về cuối nhỏ. Không có gì thú vị về nó cả. Các byte 0-7 giữ trường nghĩa và các byte 8 và 9 giữ trường số mũ và dấu.
5.0L
cũng có một ý nghĩa a000000000000000
. Số mũ không chệch của nó là +2 và độ lệch của số mũ mở rộng gấp đôi là 3fff
, do đó số mũ chệch cho 5.0L là 4001
. Mẫu byte thực tế khi được lưu trữ theo thứ tự little-endian là 00 00 00 00 00 00 00 a0 01 40
, và nếu bạn xem đó là hai số nguyên 64 bit nhỏ, bạn sẽ thấy chính xác những gì bạn đã quan sát.
4001
trong little-endian là 01 40 00 00 ...
Nếu không có gì khác, byte ít quan trọng nhất sẽ xuất hiện trước. Tôi hy vọng chuỗi a0 01 40
sẽ xuất hiện ở đâu đó trong số (nếu chúng chỉ thực hiện một vòng quay) nhưng tôi không nghĩ rằng bạn đã giải thích tại sao a0
và 01 40
nằm trong các nửa hoàn toàn riêng biệt.
Nếu bạn nghĩ rằng việc có các typedef như float32_t và float64_t là không thực tế vì bất kỳ lý do gì, thì bạn hẳn đã quá quen thuộc với hệ điều hành quen thuộc của mình, trình biên dịch và bạn không thể nhìn ra ngoài tổ ấm nhỏ của mình.
Có những phần cứng nguyên bản chạy các hoạt động dấu chấm động IEEE 32 bit và những phần cứng khác chạy 64 bit. Đôi khi các hệ thống như vậy thậm chí phải nói chuyện với nhau, trong trường hợp đó, điều cực kỳ quan trọng là phải biết liệu bộ đôi là 32 bit hay 64 bit trên mỗi nền tảng. Nếu nền tảng 32-bit phải thực hiện các tính toán quá mức dựa trên các giá trị 64-bit từ nền tảng khác, chúng tôi có thể muốn truyền xuống độ chính xác thấp hơn tùy thuộc vào yêu cầu về thời gian và tốc độ.
Cá nhân tôi cảm thấy không thoải mái khi sử dụng phao và nhân đôi trừ khi tôi biết chính xác chúng có bao nhiêu bit trên Platfrom của tôi. Thậm chí nhiều hơn thế nếu tôi muốn chuyển những thứ này sang một nền tảng khác qua một số kênh liên lạc.
Hiện có một đề xuất để thêm các loại sau vào ngôn ngữ:
decimal32
decimal64
decimal128
mà một ngày nào đó có thể có thể truy cập được #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html