https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96711

--- Comment #10 from B Eggen <bre08 at eggen dot co.uk> ---
I've been experimenting with the suggested work-around

m = anint(y)

This works for larger numbers, even in quad precision, however, it breaks down
a long way before the integer*16 range is exhausted, consider the code below,
which starts with 2^113 and tries to double it, minus 1.  The minus 1 is not
taking effect:

-> ./aint_working.e
     10384593717069655257060992658440192.0000000000
 the next two lines should end in ...83

     20769187434139310514121985316880384.0000000000
     20769187434139310514121985316880384.0000000000

     20769187434139310514121985316880383

The source code is:


program aint_working

! does not work in quad precision (real*16)
! -> echo '2^113' | bc = 10384593717069655257060992658440192
! -> echo '2^114' | bc = 20769187434139310514121985316880384

  integer(kind=16) :: i, j, k

  integer, parameter :: idp=selected_real_kind(9,99)
  integer, parameter :: iqp=selected_real_kind(19,199)
  integer, parameter :: i16=selected_int_kind(38)

  real(kind=iqp) :: x, y, z

  x=10384593717069655257060992658440192.0q0  ! that is 2^113

  i=10384593717069655257060992658440192_16 ! as above, but integer
  k=20769187434139310514121985316880384_16 ! that is 2^114

  write(*,'(1x,f50.10)') x

  write(*,*) 'the next two lines should end in ...83'
  write(*,*)

  y=(x+x)-1.0q0
  write(*,'(1x,f50.10)') y

  z=(x-1.0q0)+x ! see if this helps
  write(*,'(1x,f50.10)') z

  j=(i+i)-1_16
  write(*,*)
  write(*,'(1x,i39)') j ! this is correct result (2^114-1)

  stop
end program aint_working


I guess at some point NINT() will be fixed, can anyone suggest a robust
workaround that is valid until 2^127-1 ?

Thanks, Bernd

Reply via email to