Hi there,
We're using 64-bit ifort on linux and its version is 11.1 056.
I have to assign the value of a real*8 variable var_r8 to another real*4 variable var_r4.
If var_r8 is checked to be within upper/lower bounds of real*4, is it save to use
var_r4 = var_r8
In case var_r8 exceeds the smallest number which can be handled by real*4, var_r4 can be set as 0.0.
Your opinion is very much appreciated.
連結已複製
Tim,
Thanks a lot for the info. Function "huge" is the one to implement. Do you know the corresponding function to show the smallest real*4? I surfed the Internet but only found the compiler flags which handle floating point underflow. However, I need to assign real*8 to real*4 and those flags are not too useful.
Thank you!
You implied you weren't concerned about underflow. Partial or full underflow will set in for abs(x) < tiny(x).
If you are talking about compile options for abrupt underflow (such as ifort default -ftz) those simply assure that there is no partial underflow, so that real(x, kind(1.) ) always gives 0. for abs(x) < tiny(x).
-ftz has an effect only when used to compile the main program. If you wish to switch underflow mode at run time, under
USE ieee_arithmetic
...
logical gradual_underflow
....
gradual_underflow= .....
call ieee_set_underflow_mode(gradual_underflow)
The only reason for introduction of these complications was that CPUs prior to Core I7-2 "Sandy Bridge" exhibited poor performance when encountering gradual underflow. It's not clear that these facilitate whatever reasons you may have for reducing double to single precision.
HUGE and TINY are Fortran intrinsics; no need to implement them yourself, just look at ifort's excellent documentation. Also the masked assignment with the WHERE statement and construct may be consistent with your needs.
