Weird fortran problem (Assigned variable value doesn't match up with output)

Click For Summary

Discussion Overview

The discussion revolves around a problem encountered in Fortran programming related to the assignment of high-precision values to variables. Participants explore issues with precision when using mathematical constants and functions, particularly in the context of variable types and kind specifications.

Discussion Character

  • Technical explanation, Conceptual clarification, Debate/contested

Main Points Raised

  • One participant describes an issue where the calculated value of Pi using 2*accos(0.0) does not match the assigned value, suggesting a potential problem with the kind flag used in the variable declaration.
  • Another participant proposes that the mismatch arises from assigning a value of one type to a variable of a different type, emphasizing the need for both to be declared of the same type.
  • A different approach is suggested, where constants are explicitly declared as double precision using a suffix (e.g., 3.141592653589793238462643d0) to ensure accuracy.
  • One participant expresses confusion about the output of real(kind=8) variables, initially assuming that the assigned values would automatically match the variable type, but later acknowledges a resolution to the issue.

Areas of Agreement / Disagreement

Participants generally agree on the importance of matching variable types and precision in Fortran, but there are multiple approaches suggested for handling precision issues, indicating that no single solution is universally accepted.

Contextual Notes

Participants discuss the implications of using different types and precision levels in Fortran, highlighting the need for careful consideration of variable declarations and constant assignments. The discussion does not resolve all uncertainties regarding best practices in precision handling.

Cbuha
Messages
2
Reaction score
0
I ran into a kind of strange thing today while coding. I needed Pi in a program, so I used 2*accos(0.0) to pull it out, but my answers were slightly off. I checked the Pi calculated and it was off after a few decimal places.

"Odd", I thought, and just decided to put in Pi as an assigned number. However, this still didn't solve the problem! No matter how I inputted it, it was being altered somehow by the program. I whipped up a really quick program to demonstrate what I'm talking about.
program probs
real(kind=8)::v

v=3.141592653589793238462643
write(*,*)v
end

if you check the output( assuming it's not just my machine or compiler for some reason) you'll see the values for v and the number inputted for it are not the same.

I'm guessing it has something to do with using the kind flag, but I'm not much of a comp sci person, and my searches didn't turn up anything useful. Anyone have any clue how to fix this? If it is related to kind, how can I keep high precision while avoiding this problem?
 
Technology news on Phys.org
The reason being the value you are assigning is one type and the variable on the left is a different type...if you are going to be declaring variables of different types that the default, you need to assign value of different type than the default; in fact, they should be declared of the exact same type...follow? maybe an example:

Code:
program probs
integer, parameter :: rrr=SELECTED_REAL_KIND(15,307)
real(KIND=rrr) :: v

v=3.141592653589793238462643_rrr
write(*,*)v
end

Here, we first declare a "type"...that's the integer variable rrr.
Then, we declare the variable v of that kind
Then, in order to assign a literal constant to that variable with suffix it with the same "type"...with '_rrr'

Now, test this program and you will see.
 
Or, the "traditional" way is to make sure your constants are double precision.
2*accos(0.0d0)
v=3.141592653589793238462643d0

accos(0.0) will use the single precision version of the function because its argument is single precision, so the result will only be accurate to about 5 decimal places. acos(0.0d0) should be accurate to about 15 places.
 
Thanks guys! I was just kind of confused because the output of the variables of real(kind=8) goes to the correct amount of decimal places. I never really thought it through to declare my assigned values as some type, I just assumed it would assign whatever value I placed there the correct type. It's working now tho
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 59 ·
2
Replies
59
Views
12K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 13 ·
Replies
13
Views
3K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 4 ·
Replies
4
Views
1K