Cách đặt giá trị chính xác kép trong Fortran


10

Gần đây, tôi đã gặp phải một vấn đề kỳ lạ với FORTRAN95. Tôi đã khởi tạo biến X và Y như sau:

X=1.0
Y=0.1

Sau đó tôi thêm chúng lại với nhau và in kết quả:

1.10000000149012

Sau khi kiểm tra các biến, có vẻ như 0,1 không được biểu thị ở độ chính xác kép với độ chính xác đầy đủ. Có cách nào để tránh điều này?

Câu trả lời:


21

Một cách khác để làm điều này là trước tiên chỉ định rõ ràng độ chính xác mà bạn mong muốn trong biến bằng cách sử dụng nội tại SELECTED_REAL_KIND và sau đó sử dụng điều này để xác định và khởi tạo các biến. Cái gì đó như:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

Một lợi thế tốt để làm theo cách này là bạn có thể lưu trữ định nghĩa dptrong một mô-đun, sau USEđó mô-đun đó khi cần thiết. Bây giờ nếu bạn muốn thay đổi độ chính xác của chương trình, bạn chỉ phải thay đổi định nghĩa dpở một nơi đó thay vì tìm kiếm và thay thế tất cả các D0s ở cuối các khởi tạo biến của bạn. (Đây cũng là lý do tại sao tôi khuyên bạn không nên sử dụng 1.0D-1cú pháp để xác định Y như được đề xuất. Nó hoạt động, nhưng làm cho việc tìm và thay đổi tất cả các trường hợp trong tương lai khó khăn hơn.)

Trang này trên Fortran Wiki cung cấp một số thông tin bổ sung tốt về SELECTED_REAL_KIND.


Đúng vậy, đây sẽ là cách tiếp cận tiêu chuẩn.
Ondřej Čertík

Và mọi người có thường xuyên phải thay đổi độ chính xác trên các chương trình của họ một cách mù quáng mà không cần làm thủ tục bằng cách nào và thử nghiệm không? Lý do chính để sử dụng _dpsơ đồ là để độ chính xác được xác định rõ ràng theo cách di động.
ja72

12

Bạn đã khai báo các biến là độ chính xác kép, nhưng bạn đã khởi tạo chúng với các giá trị chính xác duy nhất.

Bạn có thể đã viết:

X=1.0d0
Y=1.0d-1

Câu trả lời của Barron dưới đây là một cách khác để tạo độ chính xác gấp đôi theo nghĩa đen, với lợi thế là nó cho phép bạn thay đổi độ chính xác của các biến sau đó.


1
Tôi nghĩ rằng người ta nên sử dụng phương pháp 1.0_dp được mô tả trong bài viết dưới đây.
Ondřej Čertík

1
Tôi thứ hai nhận xét của @ OndřejČertík - Câu trả lời của Barron là câu trả lời hay nhất.
OscarB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.