2012-05-09 27 views
20

Hướng dẫn của một chương trình được viết trong Fortran 90 nói rằng "Tất cả các biến và tham số thực được chỉ định ở độ chính xác 64 bit (tức là real*8).""real * 8" có nghĩa là gì?

Theo Wikipedia, độ chính xác đơn tương ứng với độ chính xác 32 bit, trong khi độ chính xác gấp đôi tương ứng với độ chính xác 64 bit, vì vậy rõ ràng chương trình sử dụng độ chính xác gấp đôi.

Nhưng real*8 có nghĩa là gì?

Tôi nghĩ rằng 8 có nghĩa là 8 chữ số theo dấu thập phân. Tuy nhiên, Wikipedia dường như nói rằng độ chính xác đơn thường cung cấp 6-9 chữ số trong khi double precision thường cung cấp 15-17 chữ số. Điều này có nghĩa là câu lệnh "độ chính xác 64 bit" không phù hợp với real*8?

Trả lời

28

Số 8 đề cập đến số lượng byte mà loại dữ liệu sử dụng.

Vì vậy, số nguyên 32 bit là integer*4 dọc theo cùng một dòng.

Một tìm kiếm nhanh chóng tìm thấy this guide to Fortran data types, trong đó bao gồm:

Các "thực * 4" tuyên bố xác định tên biến là single chính xác 4-byte số thực trong đó có 7 chữ số chính xác và một loạt tầm quan trọng của 10 từ -38 đến +38. Câu lệnh "real" giống với câu lệnh "real * 4" trong gần như tất cả các máy tính 32 bit.

Các "thực * 8" tuyên bố xác định tên biến để được tăng gấp đôi độ chính xác 8-byte số thực trong đó có 15 chữ số chính xác và một loạt tầm quan trọng của 10 từ -308 đến + 308. Câu lệnh "double precision" giống với câu lệnh "real * 8" trong gần như tất cả các máy tính 32 bit.

+9

-1 cho Jon Skeet trả lời câu hỏi của Fortran bằng cách trích dẫn từ tài liệu tham khảo cổ xưa và gây hiểu lầm. Các câu trả lời khác cho câu hỏi này thể hiện sự hiểu biết tốt hơn về Fortran hiện đại. –

+5

@HighPerformanceMark: Có lẽ bạn có thể đưa ra một liên kết hữu ích hơn để tôi thay đổi sau đó? Tôi chắc chắn sẽ không tuyên bố rằng tôi thậm chí còn am hiểu về Fortran, nhưng là cốt lõi của câu trả lời (rằng 8 đại diện cho số byte) thực sự không chính xác hoặc gây nhầm lẫn? –

10

Các ký hiệu sao (như TYPE*n được gọi) là một cấu trúc Fortran phi tiêu chuẩn nếu được sử dụng với TYPE khác hơn CHARACTER.

Nếu áp dụng cho loại ký tự, nó sẽ tạo một mảng gồm n ký tự (hoặc một chuỗi gồm n ký tự).

Nếu được áp dụng cho loại khác, nó chỉ định kích thước bộ nhớ theo byte. Điều này nên tránh bằng mọi giá ở Fortran 90+, trong đó khái niệm về loại LOẠI được giới thiệu. Chỉ định dung lượng lưu trữ sẽ tạo ra các ứng dụng không di động.

21

Hiện có ít nhất 4 cách để xác định độ chính xác ở Fortran.

Như đã trả lời, real*8 chỉ định số byte. Nó hơi lỗi thời nhưng phải an toàn.

Cách mới là "loại". Người ta nên sử dụng các chức năng nội tại để có được loại có độ chính xác mà bạn cần. Việc xác định loại theo giá trị số cụ thể là nguy hiểm vì các trình biên dịch khác nhau sử dụng các giá trị khác nhau.

Một cách khác là sử dụng các loại được đặt tên theo tiêu chuẩn ISO_C_Binding.This question thảo luận về hệ thống loại cho số nguyên - nó rất giống với thực tế.

+5

CẬP NHẬT: phần mở rộng Fortran 2008 của mô-đun môi trường ISO hiện được hỗ trợ nhiều hơn. Vì vậy, nếu bạn 'sử dụng ISO_FORTRAN_ENV', bạn sẽ có quyền truy cập vào các giá trị loại chỉ định các loại thực và số nguyên theo số bit (ví dụ,' real (real32) :: 'và' real (real64) :: ') như một tiêu chuẩn và di động cách xác định loại theo kích thước lưu trữ. –