0**0 is problematic both mathematically and as a floating-point operation. There are times even in mathematical series where it is treated as one. But if you just enter:
print *, x0**x0
I will be very surprised if you do not print “1” instead of “NaN”.
What result do you get?
Borrowing a few things from the previous examples …
program nanieee
use, intrinsic :: iso_fortran_env, wp=>real32
use ieee_arithmetic, only: ieee_value, &
& ieee_quiet_nan, ieee_signaling_nan, &
& ieee_is_nan, ieee_is_normal, &
& ieee_is_finite, ieee_is_negative
implicit none
real(kind=wp,parameter :: x0=0.0
real(kind=wp) :: readnan
character :: charnan*3 = 'NAN'
read(charnan,*) readnan
call display('read-in ',readnan )
call display('x0/x0 ',x0/x0 )
call display('x0**x0 ',x0**x0 )
call display('one ',1.0 )
call display('IEEE quiet ',ieee_value(0.0,ieee_quiet_nan) )
call display('IEEE signaling ',ieee_value(0.0,ieee_signaling_nan) )
contains
subroutine display(title,value)
character(len=*),intent(in) :: title
real(kind=wp),intent(in) :: value
integer :: ix, s, e, f
ix = transfer(value,ix)
s = ibits(ix,31,1)
e = ibits(ix,23,8)
f = ibits(ix,0,23)
write(*,'(a)',advance='no') title
write(*,'(1x,f14.7)',advance='no') value
write(*,'(1x,z8.8)',advance='no') value
write(*,'(1x,b1.1,1x,b8.8,1x,b23.23)',advance='no') s, e, f
write(*,'(1x,a)',advance='no') merge('normal ','not normal',ieee_is_normal(value))
write(*,'(1x,a)',advance='no') merge('nan ','not nan ',ieee_is_nan(value))
write(*,'(1x,a)',advance='no') merge('neg ','not neg ',ieee_is_negative(value))
write(*,'(1x,a)',advance='no') merge('finite ','not finite',ieee_is_finite(value))
write(*,'(1x,g0)',advance='yes') exponent(value)
!print *, int(sign(1.0,value)), merge('negative',' ',ieee_is_negative(value))
end subroutine display
With default compiler switches gfortran produces “1” for 0.0**0.0:
end program nanieee
read-in NaN 7FC00000 0 11111111 10000000000000000000000 not normal nan not neg not finite 2147483647
x0/x0 NaN FFC00000 1 11111111 10000000000000000000000 not normal nan not neg not finite 2147483647
x0**x0 1.0000000 3F800000 0 01111111 00000000000000000000000 normal not nan not neg finite 1
one 1.0000000 3F800000 0 01111111 00000000000000000000000 normal not nan not neg finite 1
IEEE quiet NaN 7FC00000 0 11111111 10000000000000000000000 not normal nan not neg not finite 2147483647
IEEE signaling NaN 7FA00000 0 11111111 01000000000000000000000 not normal nan not neg not finite 2147483647