У меня есть следующая строка в какой-то Fortran код:Оптимизация умножения на ноль
acc = acc + DRSite_t(u, k, s) * Exp(-(max(0.0_dp, t1 - real(s, dp))/TAT(ds, k)))
где DRSite_t
и TAT
являются оба массива не функции.
Очевидно, что если значение DRSite_t
равно нулю, комплексное вычисление справа от оператора умножения не нужно оценивать.
Является ли современный компилятор, вероятно, поднять на это и оптимизировать, или я должен обернуть его в блок if
?
Или это случай, когда я должен просто сосать его и видеть? Я использую gfortran, если это имеет значение, но было бы интересно услышать, будут ли разные компиляторы обрабатывать вещи по-разному.
[Не стоит добавлять свой собственный ответ для этого.] Возможно, стоит также отметить, что 'DRSite_t (u, k, s)' being '0' не означает, что все выражение' DRSite_t (u, k, s) * (horrible_thing) 'is' 0': в некоторых случаях это может быть '-0'. По общему признанию, в этом случае это, вероятно, не будет. – francescalus
Это правда. Я часто компилирую с '-ffast-math', поэтому мне не нужны такие тонкости. –
'TAT()' всегда будет положительным, поэтому '(ужасная вещь)' также всегда будет положительной. –