логическое выражение в fortran

#fortran #fortran90

#fortran #fortran90

Вопрос:

* Я пытаюсь сгруппировать набор данных в соответствии с некоторым условием, используя код FORTRAN. Код выглядит следующим образом.

 gauche = 0.0
trans = 0.0
do i = 1, total_data
!write(*,*) nombor(i), dihedral(i)

if  (   (0 > dihedral(i) < 120) .or. (-120 > dihedral(i) < 0)   )  then

    gauche = gauche     1 
else
    trans = trans       1
endif       
end do

write(20,*) "Layer1_seg_total=  ",(gauche trans)," ","gauche_seg= ",gauche,"trans_seg= trans
 

Но когда я компилирую, я получаю сообщение об ошибке, как показано ниже:

 if  ((0 > dihedral(i) < 120) .or. (-120 > dihedral(i) < 0))  then
                      1
Error: Expected a right parenthesis in expression at (1)
population.f90:42.5:

else
    1
Error: Unexpected ELSE statement at (1)
population.f90:44.4:

endif  
   1
Error: Expecting END DO statement at (1)
 

Я не могу отследить ошибку. Может кто-нибудь подсказать ошибку?

ПРИМЕЧАНИЕ: это не задание

Ответ №1:

Fortran 90 имеет шесть реляционных операторов: <, <=, >, >=, ==, /=
Каждый из этих шести реляционных операторов принимает два выражения, сравнивает их значения и выдает .TRUE. или .FALSE.
Таким образом, a> b < c неверно, потому что a < b ЛОГИЧНО, а c РЕАЛЬНО.

Перепишите свой тест как:

 if  ( (0 > dihedral(i) .and. dihedral(i) < 120) .or. (-120 > dihedral(i) .and. dihedral(i) < 0) )  then
 

Комментарии:

1. Верно, но логически выражение (0> x .и. x < 120) и другое также не имеют смысла. Я думаю, что это (0 < x .и. x < 120).

2. Согласен, хотя, насколько я понимаю, вопрос был больше о понимании сообщения компилятора 🙂

Ответ №2:

Вы не можете комбинировать выражения, подобные этому: a > b < c в Fortran Напишите что-то вроде этого: a> b .и. b < c

Ответ №3:

Что это?

 0 > dihedral(i) < 120
 

Если это a < x < b, то оно должно быть записано как

 a < x .and. x < b
 

Если это что-то другое…