2012-02-23 34 views
6

Theo trang web sau đây: http://en.cppreference.com/w/cpp/language/typesDouble - IEEE 754 lựa chọn thay thế

"đôi - độ chính xác gấp đôi loại dấu chấm động thường IEEE-754 64 bit loại dấu chấm động.".

Nó nói "thường". Các định dạng/tiêu chuẩn khác có thể sử dụng C++ double là gì? Trình biên dịch nào sử dụng một giải pháp thay thế cho định dạng IEEE? Hoặc kiến ​​trúc?

+0

Tôi nghĩ rằng tất cả các trường hợp ngoại lệ sẽ rất cũ. Tôi đã sử dụng một mạng dữ liệu điều khiển có điểm nổi 60 bit chẳng hạn. –

+0

Theo [kho lưu trữ của tất cả các kiến ​​thức] (http://en.wikipedia.org/wiki/Floating_point#History): một số máy tính lớn của IBM và Cray, và bất cứ thứ gì từ trước những năm 80, sử dụng các định dạng không phải IEEE. –

+0

Bất cứ điều gì phù hợp với tiêu chuẩn C++ sẽ làm. –

Trả lời

3

Để có một bài học lịch sử ngắn, bạn có thể xem Intel Floating Point Case Study.

Trình biên dịch Intel có tùy chọn được bật theo mặc định khi tối ưu hóa cho phép cái gọi là fast-math feature. Điều này làm cho toán học nhanh hơn nhiều nhưng giảm sự tuân thủ nghiêm ngặt với các tiêu chuẩn IEEE. Người ta có thể thực thi tuân thủ nghiêm ngặt tiêu chuẩn với fp-model option.

Tôi tin rằng ngôn ngữ CUDA cho GPU của NVIDIA cũng có một thư viện toán học nhanh hơn đáng kể nếu một người sẵn sàng từ bỏ việc tuân thủ nghiêm ngặt tiêu chuẩn IEEE. Điều này không chỉ làm cho toán học nhanh hơn, mà còn làm giảm số lượng thanh ghi được sử dụng cho các hàm siêu việt nói riêng.

Liệu sự tuân thủ có cần thiết hay không tùy thuộc vào từng trường hợp cụ thể. Chúng tôi đã gặp phải sự cố với tối ưu hóa Intel và phải bật tùy chọn fp-model strict để đảm bảo kết quả chính xác với phép tính chính xác gấp đôi.

6

Vaxen, Crays và IBM mainframe, để đặt tên chỉ là một số ít vẫn được sử dụng rộng rãi. Hầu hết (tất cả?) Của những người cũng có thể làm điểm nổi IEEE bây giờ, nhưng đôi khi chỉ với một tiện ích đặc biệt. Trong các trường hợp khác (IBM), số học IEEE có thể mang một hình phạt tốc độ đáng kể. Đối với các máy cũ, hầu hết các máy tính lớn (Unisys, Control Data, vv) đều sử dụng các định dạng điểm nổi độc nhất, hầu hết các định dạng này thậm chí không giống như IEEE, chưa kể đến việc thực sự phù hợp.

0

Nó có lẽ đáng để thêm vào, "Các định dạng/tiêu chuẩn khác có thể sử dụng C++ đôi?", Gcc đó cho Atmel AVR (là 8 bit của CPU dữ liệu) trong một số Arduinos) không thực hiện double dưới dạng 64 bit.

Xem GCC wiki, avr-gcc page và đặc biệt là 'double' subsection of 'Deviations from the Standard' nơi nó nói

double chỉ 32 bit rộng và thực hiện trong cùng một cách như float

Tôi tin CPU khác có triển khai tương tự, nhưng Tôi không thể tìm thấy chúng.