# Is there a way to know if a variable is NaN, +infinity, -infinity?

**URL:** <https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655>\
**Category:** Uncategorized\
**Created:** [January 26, 2022, 8:18am UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655 "2022-01-26T08:18:02Z")\
**Posts on this page:** 6\
**Page:** 2

<div class="post-metadata">

**Author:** ![Arjen](https://avatars.discourse-cdn.com/v4/letter/a/b9bd4f/32.png) [@Arjen](https://fortran-lang.discourse.group/u/Arjen)\
**Post date:** [January 27, 2022, 3:03pm UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/24 "2022-01-27T15:03:49Z")

</div>

Intel Fortran 2018 also requires that flag to handle gradually diminishing numbers. One is never to old to learn.

---

<div class="post-metadata">

**Author:** ![CRquantum](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/crquantum/32/730_2.png) [@CRquantum](https://fortran-lang.discourse.group/u/CRquantum)\
**Post date:** [May 30, 2022, 8:46pm UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/25 "2022-05-30T20:46:34Z")

</div>

If I particularly, say I want a variable x to be +infinite, what should I do?  
Should I do

```auto
x = huge(x) + 1.0

```

Is there better way to make x = + infinite ?

Thanks @Beliavsky , I see, can use things like `ieee_positive_inf` in intrinsic module `ieee_arithmetic`. Got it.

---

<div class="post-metadata">

**Author:** ![Beliavsky](https://avatars.discourse-cdn.com/v4/letter/b/ba8739/32.png) [@Beliavsky](https://fortran-lang.discourse.group/u/Beliavsky)\
**Post date:** [May 30, 2022, 9:06pm UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/26 "2022-05-30T21:06:16Z")

</div>

You can use `the ieee_is_negative()` and `ieee_is_finite()` functions of the module `ieee_arithmetic`, as I [tweeted](https://twitter.com/fortrantip/status/1486706121335263246), with example code

```auto
program test_ieee_arithmetic
use, intrinsic :: ieee_arithmetic
implicit none
character (len=20) :: fmt = "(a16,*(l9))"
integer, parameter :: wp = kind(1.0) ! same output for wp = kind(1.0d0)
real(kind=wp) :: z,vec(6),NaN,t
z = 0.0_wp
t = tiny(z)
vec = [z/z,z/1.0_wp,-z/1.0_wp,1.0_wp/z,-1.0_wp/z,t/10]
print*,ieee_value(0.0,ieee_positive_inf),1.0/z ! 2 ways of geting +Inf
NaN = ieee_value(0.0,ieee_quiet_nan) ! get NaN
print*,"NaN == NaN?",NaN == NaN ! demonstrate that NaN /= NaN
print*
print "(19x,*(a9))","0.0/0.0","0.0/1.0","-0.0/1.0","1.0/0.0","-1.0/0.0","tiny/10"
print fmt,"ieee_is_nan" ,ieee_is_nan(vec)
print fmt,"ieee_is_negative",ieee_is_negative(vec)
print fmt,"ieee_is_finite" ,ieee_is_finite(vec)
print fmt,"ieee_is_normal" ,ieee_is_normal(vec) 
end program test_ieee_arithmetic
! gfortran output:
! Infinity Infinity
! NaN == NaN? F
!
! 0.0/0.0 0.0/1.0 -0.0/1.0 1.0/0.0 -1.0/0.0 tiny/10
! ieee_is_nan T F F F F F
! ieee_is_negative F F T F T F
! ieee_is_finite F T T F F T
! ieee_is_normal F T T F F F

```

---

<div class="post-metadata">

**Author:** ![Beliavsky](https://avatars.discourse-cdn.com/v4/letter/b/ba8739/32.png) [@Beliavsky](https://fortran-lang.discourse.group/u/Beliavsky)\
**Post date:** [May 30, 2022, 9:32pm UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/27 "2022-05-30T21:32:33Z")

</div>

An [alternative from @sblionel](https://community.intel.com/t5/Intel-Fortran-Compiler/IFORT-define-for-infinity/m-p/1145939/highlight/true#M138567) that does not use the `ieee_arithmetic` module is

```auto
program main
implicit none
integer , parameter :: sp = kind(1.0), dp = kind(1.0d0)
real(kind=sp), parameter :: inftys = real(z'7f800000',kind=sp)
real(kind=dp), parameter :: inftyd = real(z'7FF0000000000000',kind=dp)
print*,inftys,inftyd ! Infinity Infinity
end program main

```

Gfortran on WSL2 requires the `-fno-range-check` option to compile it.

---

<div class="post-metadata">

**Author:** ![msz59](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@msz59](https://fortran-lang.discourse.group/u/msz59)\
**Post date:** [May 31, 2022, 11:23am UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/29 "2022-05-31T11:23:38Z")

</div>

It seems gfortran has a problem with signaling NaNs. Consider

```fortran
program test_ieee_arithmetic
  use, intrinsic :: ieee_arithmetic
  implicit none
  integer, parameter :: wp = kind(1.0)
  real(kind=wp) :: NaN, z
  integer :: inan
  z = 0.
  print *, " hex value NaN qNaN sNaN"
  NaN = ieee_value(0.0,ieee_quiet_nan) ! get qNaN
  inan = transfer(NaN,inan)
  print '("quiet: ",Z12,3L4)', inan, ieee_is_nan(NaN),is_qnan(NaN),is_snan(NaN)
  NaN = ieee_value(0.0,ieee_signaling_nan) ! get sNaN
  inan = transfer(NaN,inan)
  print '("signal:",Z12,3L4)', inan, ieee_is_nan(NaN),is_qnan(NaN),is_snan(NaN)
  NaN = 0/z ! get 0/0 NaN
  inan = transfer(NaN,inan)
  print '("0/0: ",Z12,3L4)', inan, ieee_is_nan(NaN),is_qnan(NaN),is_snan(NaN)
     
contains
  logical function is_qnan(x)
    real(kind=wp), intent(in) :: x
    is_qnan = (ieee_class(x) == ieee_quiet_nan)
  end function is_qnan
  logical function is_snan(x)
    real(kind=wp), intent(in) :: x
    is_snan = (ieee_class(x) == ieee_signaling_nan)
  end function is_snan
end program test_ieee_arithmetic

```

```nohighlight
gfortran output: ifort output:
          hex value NaN qNaN sNaN hex value NaN qNaN sNaN
quiet: FFC00000 T T F quiet: 7FC00000 T T F
signal: FFC00000 T T F signal: 7FA00000 T F T
0/0: FFC00000 T T F 0/0: FFC00000 T T F

```

So gfortran’s `ieee_value` returns the same bit pattern for both `ieee_quiet_nan` and `ieee_signaling_nan` which is then interpreted as a quiet NaN. Checked in vers. 10 and 11, independent of applying/not applying `-fsignaling-nans` option.

---

<div class="post-metadata">

**Author:** ![aledinola](https://avatars.discourse-cdn.com/v4/letter/a/3ec8ea/32.png) [@aledinola](https://fortran-lang.discourse.group/u/aledinola)\
**Post date:** [May 31, 2022, 7:14pm UTC](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655/31 "2022-05-31T19:14:58Z")

</div>

This is very useful, thanks!

[Previous page](https://fortran-lang.discourse.group/t/is-there-a-way-to-know-if-a-variable-is-nan-infinity-infinity/2655.md?page=1)
