Итак, мой вопрос: что произойдет, когда переменная одинарной точности умножается на переменную двойной точности в Фортране? Единственная точность повышается до двойной точности, а операция выполняется с двойной точностью.
Является ли результат двойной точностью, если переменная, используемая для хранения значения, объявлена как двойная точность? Не обязательно.Правая часть - это выражение, которое не «знает» о точности переменной в левой части, в которой она будет сохранена.Если у вас есть Double = SingleA * SingleB (используя имена для обозначения типов), вычисление будет выполнено с одинарной точностью, а затем преобразовано в double для хранения.Это НЕ даст дополнительной точности для расчета!
А что, если значение двойной точности умножается на константу без "D0" в конце? Это похоже на первый вопрос, константа будет повышена до двойной точности, а вычисление выполнено с двойной точностью. Однако , константа по-прежнему имеет одинарную точность, и даже если вы записали много цифр, как для константы двойной точности, внутреннее хранилище имеет одинарную точность и не может представлять эту точность.Например, DoubleVar * 3.14159265359 будет рассчитан с двойной точностью, но это будет что-то приближенное DoubleVar * 3.14159, выполненное с двойной точностью.
Если вы хотите, чтобы компилятор сохранял много цифр в константе, вы должны указать точность константы.В Fortran 90 способ сделать это состоит в том, чтобы определить собственный реальный тип с той точностью, которая вам нужна, например, требовать не менее 14 десятичных цифр:
integer, parameter :: DoubleReal_K = selected_real_kind (14)
real (DoubleReal_K) :: A
A = 5.0_DoubleReal_K
A = A * 3.14159265359_DoubleReal_K