2013-05-10 36 views
5

Nói rằng tôi có chương trình sau đây:Cải thiện độ chính xác trên các biến được xác định bởi số nguyên thương

program derp 
    implicit none 
    integer, parameter :: ikind = selected_real_kind(18) 
    real (kind = ikind) :: a = 2.0/3.0 
    print*, a 
end program derp 

Chương trình derp đầu ra 0.6666666865348815917, mà rõ ràng là không 18 chữ số chính xác. Tuy nhiên, nếu tôi xác định a=2.0b=3.0 sử dụng cùng một phương pháp và thì xác định c=a/b Tôi nhận được kết quả là 0.666666666666666666685, điều này là tốt. Làm thế nào để tôi chỉ xác định một biến như là một thương số nguyên và có nó lưu trữ tất cả các chữ số chính xác tôi muốn từ selected_real_kind?

Trả lời

8

Hãy thử: real (kind = ikind) :: a = 2.0_ikind/3.0_ikind

Lý do là trong khi LHS là độ chính xác cao, RHS trong ví dụ mã của bạn, 2.0/3.0, không phải là. Fortran thực hiện phép tính đó với độ chính xác đơn và sau đó gán kết quả cho LHS. Phía RHS không được tính chính xác cao hơn vì LHS có độ chính xác cao. digits_kind là cách chỉ định loại hằng số digits.

+0

Hoàn hảo, cảm ơn. Đó là kinda cheesy mà bạn phải làm điều đó bằng tay, nhưng tôi có thể sống với nó. –

+4

Đây là một điều cơ bản ở Fortran, RHS được đánh giá mà không xem xét LHS và sau đó được giao. Có nhiều tình huống hơn, điều này rất quan trọng. –

+0

đánh giá RHS mà không quan tâm đến độ chính xác của LHS là hầu như không có gì đặc biệt cho fortran. Nếu bạn làm một = 2/3 bạn sẽ mong đợi một hoạt động nổi (có thể interger số học là những gì bạn có nghĩa là). Những gì là duy nhất (có thể) để fortran là mặc định cho độ chính xác duy nhất. Để xấu không có một cách tiêu chuẩn để thiết lập mặc định. – agentp

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