Quantcast
Channel: Intel® Fortran Compiler
Viewing all articles
Browse latest Browse all 3270

Use of tiny / 2

$
0
0

I have been trying to understand the use of the intrinsic TRANSFER, to store a mixture of integer and real values in an integer array and then recover them. I had hoped to do this in a more standard conforming way.
Anyway, I experimented with TINY to see how real zero might look. I wrote the following program to test real underflow and how this might be stored.

  integer*4, parameter :: sp = selected_real_kind (p=6)
   real(sp) :: x

	   integer*4 i(4),j

	!

	   i = 0

	   write (*,*) 'test for real kind =',sp, kind(1.0), kind(1.0d0)

	   x = 1

	   i(1) = transfer (x,j)

	   write (*,*) '1   ', x, i

	!

	   x = tiny(x)

	   i(1:2) = transfer (x,j,2)

	   write (*,*) 'tiny', x, i

	!

	   x = x/2

	   i(1:2) = transfer (x,j,2)

	   write (*,*) 'x/2 ', x, i

	!

	   end

this produced the following result:

Intel(R) Visual Fortran Compiler XE for applications running on IA-32, Version 12.1.5.344 Build 20120612
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:tiny2.exe
-subsystem:console
tiny2.obj
 test for real kind =           4           4           8
 1      1.000000      1065353216           0           0           0
 tiny  1.1754944E-38     8388608           0           0           0
 x/2   5.8774718E-39     4194304           0           0           0

To my surprise x/2 is not zero !

My aim is to transfer 4 byte and 8 byte reals into an integer*4 vector for later recovery, but I thought I'd test a 4 byte real first. I find the use of the size argument of TRANSFER a bit confusing.

John


Viewing all articles
Browse latest Browse all 3270

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>