2009-05-08 40 views
25

Tôi gặp sự cố khi hiểu thông số kind của Fortran 90. Theo như tôi có thể nói, nó không xác định độ chính xác (tức là, float hoặc double) của một biến, cũng không xác định loại biến.Thông số loại Fortran 90

Vì vậy, nó xác định cái gì và chính xác nó là gì?

+0

bạn có đang nhắc đến ký hiệu Loại không? – TStamper

Trả lời

3

Từ số Tham chiếu Fortran nhóm Portland, thông số KIND "chỉ định độ chính xác cho loại dữ liệu nội tại". Như vậy, trong việc kê khai

real(kind=4) :: float32 
real(kind=8) :: float64 

biến float64 khai báo là một 8-byte sản (cũ Fortran DOUBLE PRECISION) và biến float32 được khai báo là một 4-byte sản (cũ Fortran REAL).

Điều này rất tốt vì nó cho phép bạn sửa độ chính xác cho các biến độc lập với trình biên dịch và máy bạn đang chạy. Nếu bạn đang chạy một tính toán đòi hỏi độ chính xác cao hơn so với độ chính xác đơn IEEE truyền thống (nếu bạn đang dùng một lớp phân tích số, rất có thể xảy ra), nhưng khai báo biến của bạn là real :: myVar, bạn sẽ ổn nếu trình biên dịch được đặt thành mặc định tất cả các giá trị real cho độ chính xác gấp đôi, nhưng thay đổi tùy chọn trình biên dịch hoặc di chuyển mã của bạn sang một máy khác với kích thước mặc định khác nhau cho các biến số realinteger sẽ dẫn đến một số bất ngờ khó chịu (ví dụ: lên).

Fortran cũng bao gồm một số chức năng sẽ giúp chọn tham số KIND là những gì bạn cần - SELECTED_INT_KINDSELECTED_REAL_KIND - nhưng nếu bạn chỉ học tôi sẽ không lo lắng về những điểm tại thời điểm này.

Vì bạn đã đề cập rằng bạn đang học Fortran như một phần của lớp, bạn cũng nên xem câu hỏi này trên Fortran resources và có thể xem hướng dẫn tham khảo từ bộ biên dịch mà bạn đang sử dụng (ví dụ: Portland Group hoặc Intel) - chúng thường có sẵn miễn phí.

+0

Không, đây không phải là di động. Đừng giới thiệu nó cho người mới bắt đầu xin vui lòng. –

44

LOẠI của biến là một nhãn số nguyên cho trình biên dịch biết các loại được hỗ trợ của nó nên sử dụng.

Ghi chú rằng mặc dù nó là chung cho tham số HÌNH THỨC NÀO để được giống như số byte lưu trữ trong một biến của loại hình đó, nó là không cần bởi các tiêu chuẩn Fortran.

Đó là, trên rất nhiều hệ thống,

REAl(KIND=4) :: xs ! 4 byte ieee float 
REAl(KIND=8) :: xd ! 8 byte ieee float 
REAl(KIND=16) :: xq ! 16 byte ieee float 

nhưng có thể có trình biên dịch ví dụ với:

REAL(KIND=1) :: XS ! 4 BYTE FLOAT 
REAL(KIND=2) :: XD ! 8 BYTE FLOAT 
REAL(KIND=3) :: XQ ! 16 BYTE FLOAT 

Tương tự như vậy đối với số nguyên và các loại logic.

(Nếu tôi đi đào, tôi có thể có thể tìm thấy ví dụ. Tìm các comp.lang.fortran nhóm usenet cho kind để tìm ví dụ. Các cuộc thảo luận thông nhất của Fortran xảy ra ở đó, với một số người có nhiều kinh nghiệm đóng góp.)

Vì vậy, nếu bạn không thể dựa vào một giá trị loại cụ thể cho bạn cùng một biểu diễn dữ liệu trên các nền tảng khác nhau, bạn sẽ làm gì?Đó là những chức năng nội tại SELECTED_REAL_KINDSELECTED_INT_KIND là dành cho. Về cơ bản, bạn cho biết chức năng sắp xếp các số bạn cần để có thể đại diện, và nó sẽ trả về loại bạn cần sử dụng.

Tôi thường sử dụng các loại, như họ thường cho tôi 4 byte và 8 byte số thực:

!--! specific precisions, usually same as real and double precision 
integer, parameter :: r6 = selected_real_kind(6) 
integer, parameter :: r15 = selected_real_kind(15) 

Vì vậy, tôi sau đó có thể khai báo một biến như:

real(kind=r15) :: xd 

Lưu ý rằng điều này có thể gây ra vấn đề mà bạn sử dụng các chương trình ngôn ngữ hỗn hợp, và bạn cần phải xác định hoàn toàn số byte mà các biến chiếm giữ. Nếu bạn cần phải chắc chắn, có nội tại yêu cầu sẽ cho bạn biết về từng loại, từ đó bạn có thể suy ra dấu chân bộ nhớ của một biến, độ chính xác, phạm vi số mũ của nó và vân vân. Hoặc, bạn có thể hoàn nguyên về kiểu khai báo phi tiêu chuẩn nhưng phổ biến là real*4, real*8 vv.

Khi bạn bắt đầu với trình biên dịch mới, bạn nên xem xét giá trị loại trình biên dịch cụ thể để biết bạn đang xử lý những gì. Tìm kiếm trên mạng cho kindfinder.f90 cho một chương trình tiện dụng sẽ cho bạn biết về các loại có sẵn cho trình biên dịch.

+4

Cảm ơn bạn đã chỉ ra rằng KIND là * không * KIND = - bạn có thấy một trình biên dịch hiện đại trong trường hợp này không? Chương trình kindfinder.f90 đó rất tuyệt. –

+3

Tìm kiếm usenet bật lên: trình biên dịch salford f95 sử dụng các loại 1,2, và 3 để đứng cho các biến 2 - 4 và 8-byte; Tôi thấy một tuyên bố rằng g77 đã làm như vậy trước khi g95 và gfortran xuất hiện; và một báo cáo rằng trình biên dịch fortran của NAG có một trình chuyển đổi trình biên dịch cho phép lựa chọn giữa lược đồ (1,2,3,4) và lược đồ (1,2,4,8). Không có nghi ngờ có những người khác. Có, kính ngắm rất tiện dụng. Bạn có thể sử dụng nó để thiết lập một tệp mô-đun dành riêng cho trang web có chứa các tham số được đặt tên cho các loại khác nhau, sao cho các chương trình thực của bạn không được rải rác bằng các số ma thuật không thể di chuyển được. –

+4

Nếu bạn thực sự muốn chỉ định các loại theo byte lưu trữ của chúng, Fortran 2003 có ISO_C_Binding, cung cấp các giá trị loại tương ứng với các loại C, một số trong đó chỉ định kích thước lưu trữ. Fortran 2008 cung cấp các loại trong mô-đun ISO_FORTRAN_ENV, chẳng hạn như giá trị loại 'real32' cho 32 bit,' real64' cho 64 bit, vv. Những thứ này có lợi thế là di động, ít nhất là miễn là bạn có Fortran 2003 hoặc 2008 trình biên dịch. Xem sách hướng dẫn sử dụng gfortran để biết danh sách các loại trong hai mô-đun này. –

4

Tôi khuyên bạn nên sử dụng Fortran 2008 trở lên; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128. Điều này được thực hiện bằng cách gọi ISO_FORTRAN_ENV trong Fortran 2003 trở lên. Các thông số loại cung cấp cách không nhất quán để đảm bảo bạn luôn nhận được số đại diện bit thích hợp

+0

'int8' (nếu có loại thích hợp), hãy chỉ định tham số loại. Tôi nghi ngờ bạn có nghĩa là một trong những nên thích này đến một số rõ ràng như thế, nói 'int (loại = 1)'? [Sau này sẽ là thực hành xấu bất kể.] Có lẽ bạn có thể làm rõ? – francescalus

+0

Tôi đồng ý với nhận xét của bạn @francescalus – Zeus

+0

@francescalus, sẽ không hữu ích khi đặt câu hỏi này thành câu hỏi chuẩn và có một "câu trả lời cộng đồng" tổng hợp toàn bộ câu chuyện cho các phiên bản khác nhau của fortran? Thường thì tôi thấy mã nơi tôi muốn tham khảo một câu trả lời hoàn chỉnh như vậy. Đây là nơi tốt nhất ở đây, nhưng thông tin là hoàn toàn trải rộng trên các câu trả lời khác nhau và các ý kiến ​​khác nhau. (xin lỗi đây là cách tốt nhất tôi đã tìm ra để liên lạc với bạn) – kvantour

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