2015-05-20 16 views
6

Tôi có dữ liệu khoa học được bán vào các tệp. Tại thời điểm này tôi đã đổ chúng với cùng một biểu diễn như trong bộ nhớ. Tôi có tài liệu rằng họ là IEEE754 nhưng tôi rất muốn có điều này khẳng định trong mã để nếu nó được chuyển đến một kiến ​​trúc kỳ lạ và tách ra từ tài liệu của tôi (mã nghiên cứu được thông qua xung quanh) nó lỗi trên biên dịch. Tại thời điểm này, tôi cóLàm cách nào để có thể kiểm tra biểu diễn dấu phẩy động để lưu trữ tệp?

static_assert(sizeof(double)==8), "message"); 

Có cách nào để kiểm tra IEEE754 không? Và điều đó có thể được khẳng định không?

+3

Trừ khi tập hợp dữ liệu rất lớn, hãy xem xét lưu trữ dữ liệu dưới dạng văn bản - tương thích hơn nhiều, di động và tương thích ngược. –

+0

Trước hết: đó là vấn đề C hoặc C++? Các giải pháp khác nhau. – LPs

+0

Về lý thuyết có '__STDC_IEC_559__' để kiểm tra, nhưng trong thực tế hầu như không có trình biên dịch nào mà tôi biết định nghĩa nó; Tôi sẽ giải quyết để kiểm tra các đại diện nhị phân của một vài trường hợp góc. Nhưng dù sao, nhiều hơn không có IEEE754 (đó là tương đối hiếm) Tôi sẽ kiểm tra lại tính cuối cùng. –

Trả lời

4

Trong C, kiểm tra nếu điều này được định nghĩa:

__STDC_IEC_559__ 

Trong C++, kiểm tra xem đây là true:

std::numeric_limits<double>::is_iec559() 

IEC559, viết tắt của Ủy ban kỹ thuật điện quốc tế tiêu chuẩn 559, cũng giống như IEEE 754.

1

Bạn có thể sử dụng std::numeric_limits<double> 's is_iec559 - xem here

3

Câu trả lời cho C++ là ở đây: How to check if C++ compiler uses IEEE 754 floating point standard

Đối với C, Phụ lục F của Standard C hiện nay xác định rằng tiền xử lý liên tục __STDC_IEC_559__ sẽ được xác định trước với giá trị 1 nếu nền tảng này phù hợp với các đặc điểm kỹ thuật IEEE 754 cho số học dấu chấm động. Nhưng các trình biên dịch C cũ hơn có thể không định nghĩa trước nó ngay cả khi các phao thực sự là IEEE 754.

Nhưng điều này là không đủ cho một trong hai ngôn ngữ: sự phù hợp này chỉ đảm bảo ngữ nghĩa của IEEE 754 chứ không phải biểu diễn nhị phân. bán phá giá biểu diễn nhị phân cho một tệp, bạn cũng sẽ cần xử lý vấn đề endianness. Nó trở nên phức tạp hơn vì độ tin cậy đối với các số nguyên có thể khác với tính cuối của float.

Cuối cùng, tốt hơn bạn nên sử dụng biểu diễn văn bản để lưu trữ các giá trị dấu phẩy động nếu bạn muốn đạt được tính di động giữa các nền tảng khác nhau, hiện tại và tương lai. Tất nhiên, bạn sẽ cần phải sử dụng độ chính xác tối đa cho biểu diễn này.

Một giải pháp khác được cung cấp bởi http://hdfgroup.org xử lý vấn đề này rất hiệu quả đối với số lượng lớn dữ liệu.

Các vấn đề liên quan