Каким будет преобразование следующего логического оператора C ++ в Fortran 90 (.f90)? Если (vx
присутствует или vy
настоящее). Вот vx
а также vy
являются составляющими скорости
if(vx || vy){
vT=sqrt(vx*vx + vy*vy);
}
Я пытался следовать
if(vx .or. vy) then
vT = sqrt(vx*vx + vy*vy)
end if
но я получаю ошибку:
operands of logical operator `.or.` at (1) are REAL(8)/REAL(8).
Кто-нибудь может направить меня сюда?
Версия C ++ неявно сравнивает vx
а также vy
с нуля.
В Фортране вы должны сделать это явно1:
if (vx /= 0 .or. vy /= 0) then
Так как if
утверждение выглядит как оптимизация производительности, возможно, стоит задаться вопросом, нужно ли оно вообще или его можно заменить безусловным присваиванием vT
(что бы установить vT
в ноль, если оба vx
а также vy
равны нулю).
1 Я надеюсь, что понял это правильно; не программировал на Фортране много лет.
В данном случае это не актуально, но в целом следует отметить, что логические операции на Фортране не имеют короткого замыкания. Так, например, следующий код C ++
if (a == 0 || 10 / a == 1)
{
...
}
не эквивалентно
if (a == 0 .or. 10 / a == 1) then
...
end if
в Фортране. Компилятор может решить сначала оценить второе слагаемое, а затем … упс. Должно быть написано с использованием двух вложенных if
s.