2012-02-09 36 views
6

Có thể nhận được hơn 16 chữ số với độ chính xác double mà không sử dụng quadruple không? Nếu nó là có thể, nó phụ thuộc vào trình biên dịch hay cái gì khác? Bởi vì tôi biết ai đó nói rằng anh ấy đang làm việc với độ chính xác double và có độ chính xác 22 chữ số.Độ chính xác gấp đôi mở rộng

Trả lời

6

Kiểu dữ liệu double precision bắt nguồn từ Fortran 77 và yêu cầu duy nhất cho loại đó là có độ chính xác cao hơn real. Bạn không nên sử dụng nó nữa.

Trong Fortran 90/95 trở lên, ít nhất hai kích thước của số thực được hỗ trợ. Độ chính xác được xác định bởi tham số kind, trong đó giá trị phụ thuộc vào trình biên dịch.

real(kind=8) :: a, b 

Để có một cách cầm tay xác định chính xác, bạn có thể có được một giá trị kind cho phép một độ chính xác nhất định bằng cách sử dụng:

integer, parameter :: long_double = SELECTED_REAL_KIND(22) 

sau đó bạn có thể khai báo các biến của bạn như

real(kind=long_double) :: a, b 

nhưng không chắc chắn trình biên dịch của bạn sẽ hỗ trợ độ chính xác đó, trong trường hợp này, hàm SELECTED_REAL_KIND sẽ trả về số âm.

cũng this post

+0

Nhưng bạn đã viết 'số nguyên'. Chỉ có thể 'số nguyên' có 22 chữ số không phải là' double'? – Shibli

+0

'long_double' là một số nguyên được sử dụng để chỉ ra' loại' của các biến 'thực' là' a' và 'b' sao cho chúng có ít nhất độ chính xác 22 – steabert

+2

@Shibli Nó cũng thường hữu ích để có được các loại chính xác đơn và đôi nổi trên hệ thống của bạn theo cách di động. Đối với điều này có thể sử dụng 'số nguyên, tham số :: sp = loại (1.e0)' và 'số nguyên, tham số :: dp = loại (1.d0)'. Sau đó bạn có thể khai báo một float chính xác kép là 'real (type = dp) :: double'. – Chris

5

thấy Theo các tiểu bang trả lời đầu tiên, cách cầm tay hầu hết là để xác định độ chính xác của số là sử dụng các chức năng nội tại. Khái niệm thiết kế của ngôn ngữ là bạn tìm ra độ chính xác được yêu cầu cho phép tính của bạn và yêu cầu nó, và trình biên dịch cung cấp độ chính xác hoặc tốt hơn. Ví dụ: nếu bạn tính toán rằng giải pháp phương trình vi phân của bạn ổn định với 11 số thập phân, thì bạn yêu cầu giá trị này và trình biên dịch cung cấp loại tốt nhất đáp ứng yêu cầu của bạn. Đây là một cách tiếp cận nước ngoài cho hầu hết các lập trình viên, những người đã từng nghĩ về những lựa chọn được cung cấp bởi phần cứng thay vì những gì họ cần, và có lẽ không dễ dàng như vậy vì ít người trong chúng ta là những nhà phân tích số.

Nếu bạn muốn sử dụng SELECTED_REAL_KIND nội tại và tối ưu hóa cho trình biên dịch và phần cứng cụ thể của bạn, bạn có thể muốn thử nghiệm. Một số kết hợp sẽ cung cấp độ chính xác tứ cực trong phần mềm, sẽ chậm. Trình biên dịch có độ chính xác gấp đôi và độ chính xác mở rộng 10 byte sẽ cung cấp loại dài hơn thông qua selected_real_kind (17). Trình biên dịch có độ chính xác gấp đôi và độ chính xác gấp bốn lần nhưng độ chính xác mở rộng 10 byte sẽ cung cấp độ chính xác gấp bốn lần qua select_real_kind (17) hoặc selected_real_kind (32). (Tôi không biết bất kỳ trình biên dịch hỗ trợ cả hai mở rộng 10-byte và tứ cực.) Trình biên dịch mà thiếu chính xác tứ cực sẽ trả về -1 cho selected_real_kind (32).

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