2015-03-31 13 views
8

tôi là một chút stucked với lưu trữ số với độ chính xác tối đa có sẵn:Làm thế nào để lưu trữ kép với độ chính xác tối đa

double tmp = 569.232306826889043804840184748172760009765625L; 

Tôi đang cố gắng để in nó trên màn hình:

printf("%0.52f\n", tmp); 

Và đó là những gì tôi đã có:

569,2323068268890400000000000000000000000000000000000000

Đây có phải là độ chính xác tối đa mà tôi có thể đạt được không?


P.S. Tôi đang sử dụng Visual Studio 2008

+2

Trong C++, bạn có thể sử dụng ['std :: numeric_limits'] (http://en.cppreference.com/w/cpp/types/numeric_limits) để tìm ra giới hạn và độ chính xác. –

+0

Bạn cũng nên nhớ rằng không chỉ có độ chính xác mà còn chính xác. Rất nhiều số thập phân không thể được biểu diễn chính xác với các dấu phẩy động. –

+2

'Tôi là một chút mắc kẹt với lưu trữ số lượng với độ chính xác có sẵn tối đa' Tại sao bị mắc kẹt? Chỉ cần khai báo một 'double' (hoặc' long double'), và ở đó bạn có "độ chính xác tối đa" của bạn. Nếu không, tôi không hiểu hết câu hỏi của bạn. – PaulMcKenzie

Trả lời

14

Một đôi thường được lưu trữ ở định dạng IEEE 754 binary64.

Một binary64 có 52 bits chính xác, không phải 52 chữ số thập phân - số này tương đương với tối đa 17 chữ số thập phân, đó là những gì bạn đang hiển thị.


Đây có phải là độ chính xác tối đa mà tôi có thể đạt được không?

Một số nền tảng thể cung cấp một long double mà thực sự là lớn hơn một double, nhưng bạn dường như không.

Nếu bạn muốn có độ chính xác cao hơn, bạn có thể sử dụng thư viện hiển thị một số loại lớn hơn/chính xác hơn được phần cứng của bạn hỗ trợ (chẳng hạn như mở rộng 80 bit) hoặc thư viện chính xác tùy ý hoạt động trong phần mềm.

+0

Ngôn ngữ không chỉ định độ chính xác của 'double', mặc dù nó chỉ định các yêu cầu tối thiểu. 52 bit là điển hình, nhưng không bắt buộc. –

+0

Để chính xác, câu trả lời này mô tả một số đặc điểm của định dạng kép nhị phân IEEE-754 ("binary64").Đó là định dạng dấu chấm động có liên quan đến câu hỏi, nhưng nó không nên được thực hiện để ngụ ý rằng C yêu cầu triển khai để sử dụng định dạng đó khi biểu diễn của chúng về kiểu 'double'. Đó là bởi đến nay sự lựa chọn phổ biến nhất, những ngày này, mặc dù. –

+0

Cả hai điểm tốt, tôi đã chỉnh sửa một cách chính xác. – Useless

6

Đó là độ chính xác của loại double trong triển khai C của bạn. Việc triển khai C tương thích cũng có loại long double, trong đó có thể cung cấp độ chính xác cao hơn.

Nếu bạn cần độ chính xác cao hơn thì có các thư viện số cung cấp các loại số và chức năng tùy ý chính xác tùy ý để hoạt động trên chúng. GNU Multiple Precision Arithmetic Library là một trong số đó; nó hoạt động trên nhiều nền tảng, bao gồm cả những nền tảng phù hợp với bạn - Win32 và Win64.

+0

Trang web được liên kết chứa “Nó cũng được biết là hoạt động trên Windows ở cả chế độ 32 bit và 64 bit”. – cremno

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