Реальное значение после присваивания отличается от реального выражения - PullRequest
1 голос
/ 19 января 2020

Я перевожу код из Фортрана. Я получаю странное поведение во время назначения. Я знаю, что добавление кода может быть очень полезным, но я не могу добавить точный код (я не авторизован), и мне не удалось его воспроизвести.

Строки следующие (qk был предопределен и qk1 не было):

   print*,"qk",qk     
   print*,"qk1",qk1
   QK1=QK
   print*,"qk",qk
   print*,"qk1",qk1

, и я печатаю эти значения:

    qk   21909779.000000000     
    qk1   6.44842193E+32
    qk   21909779.000000000     
    qk1   21909780.0 

Дело в том, что я ожидал бы получить qk1 равным qk ... почему они другой? Когда я пытаюсь воспроизвести его, очевидно, что у меня печатаются те же значения.

Поскольку я не добавил код, я не ожидаю точного ответа ... Кто-нибудь знает, что проверять?

1 Ответ

6 голосов
/ 20 января 2020

Причина в том, что, как указано в комментариях, qk имеет одинарную точность, qk1 double, и при требуемых значениях интервал между значениями одинарной точности составляет 2:

Program one_out

  Use, Intrinsic :: iso_fortran_env, Only : real32, real64

  Implicit None

  Real( real64 ) :: qk64
  Real( real32 ) :: qk32

  qk64 = 21909779.0_real64
  qk32 = qk64

  Write( *, * ) 'qk64 = ', qk64
  Write( *, * ) 'qk32 = ', qk32

  Write( *, * ) '64 spacing ', Spacing( qk64 )
  Write( *, * ) '32 spacing ', Spacing( qk32 )

End Program one_out

ian@eris:~/work/stack$ gfortran -Wall -Wextra -fcheck=all -std=f2008 one_out.f90 
one_out.f90:11:9:

   qk32 = qk64
         1
Warning: Possible change of value in conversion from REAL(8) to REAL(4) at (1) [-Wconversion]
ian@eris:~/work/stack$ ./a.out
 qk64 =    21909779.000000000     
 qk32 =    21909780.0    
 64 spacing    3.7252902984619141E-009
 32 spacing    2.00000000    

Самый важный урок здесь всегда всегда используйте Implicit None - и второе: предупреждения компилятора полезны, включите их и решите, что они значат!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...