Question

I have a scenario where i declare a variable real*8 and read a value

0.1234123412341234

which is stored in a file.

When i try to read it on Linux to a variable and display the value, it prints

0.12341234123412

whereas when i run the same code for AIX it prints the value

0.12341234123412370

Why does both the platform print different values for the same code? Is there any possibility to overcome this without using format specifier?

P.S

AIX compiler is xlf

Linux compiler is ifort

Was it helpful?

Solution

I assume that you are using list-directed IO, write (X, *). While this type of IO is convenient, the output is not fully specified by the standard. If you want your output to be extremely similar across compilers and platforms, you should use a format. (You might still have small variations in results due to the use of finite-precision arithmetic.)

OTHER TIPS

You shouldn't use REAL*8 for declaring double variables, you should use

INTEGER, PARAMETER :: prec = SELECTED_REAL_KIND(15,307)
REAL(prec) :: variable

to specify a portable double-precision variables (see here for more details).

In any event, the problem you are experiencing is related to precision. A double-precision variable can go to 15 digits before becoming wrong, which appears to be the case with both compilers. In fact, I would argue that these are indeed the same number because of how close they are (a % difference of about 3E-12).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top