оператор if — преобразование логического оператора OR из C ++ в Fortran

Каким будет преобразование следующего логического оператора 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).

Кто-нибудь может направить меня сюда?

3

Решение

Версия C ++ неявно сравнивает vx а также vy с нуля.

В Фортране вы должны сделать это явно1:

if (vx /= 0 .or. vy /= 0) then

Так как if утверждение выглядит как оптимизация производительности, возможно, стоит задаться вопросом, нужно ли оно вообще или его можно заменить безусловным присваиванием vT (что бы установить vT в ноль, если оба vx а также vy равны нулю).

1 Я надеюсь, что понял это правильно; не программировал на Фортране много лет.

7

Другие решения

В данном случае это не актуально, но в целом следует отметить, что логические операции на Фортране не имеют короткого замыкания. Так, например, следующий код C ++

if (a == 0 || 10 / a == 1)
{
...
}

не эквивалентно

if (a == 0 .or. 10 / a == 1) then
...
end if

в Фортране. Компилятор может решить сначала оценить второе слагаемое, а затем … упс. Должно быть написано с использованием двух вложенных ifs.

4

По вопросам рекламы [email protected]