Арифметические выражения

Приведем примеры записи арифметических выражений на Фортране:

Математическая формула Арифметическое выражение на Фортране
Арифметические выражения - student2.ru (a+b)/(c*d)
p+q sin2a p+q*sin(a)**2
Арифметические выражения - student2.ru e-f(i,k)**2*g(k,j)

Для того чтобы правильно записывать арифметические выражения, нужно соблюдать следующие правила:

1. Все символы пишутся в строчку на одном уровне. Проставляются все знаки операций (нельзя пропускать *).

2. Не допускаются два следующих подряд знака операций. (Нельзя A + – B; можно A + (–B).)

3. Операции с более высоким приоритетом (рангом) выполняются раньше операций с меньшим приоритетом.

4. Вычисление функции имеет более высокий ранг, чем арифметические операции. Аргумент функции – выражение, стоящее в круглых скобках после имени функции.

5. Операции одного ранга выполняются слева направо (возведение в степень – справа налево).

6. Часть выражения, заключенная в скобки, вычисляется в первую очередь. (Например, (A+B)*(C–D) — умножение производится после сложения и вычитания.)

Не следует записывать выражений, не имеющих математического смысла :

· деления на нуль;

· возведения нулевого значения в отрицательную или нулевую степень;

· возведения отрицательного операнда в нецелочисленную степень.

В таких ситуациях происходит прерывание работы процессора.

При переносе длинного выражения на следующую строку нельзя повторять знак операции.

Пример. Цифрами сверху указан порядок выполнения операций:

Арифметические выражения - student2.ru

Данное арифметическое выражение соответствует следующей математической формуле:

Арифметические выражения - student2.ru

Преобразование типов операндов при вычислении выражений.При выполнении двухместной операции

A знак B :

– если типы А и В одинаковые, то и тип результата – тот же;

– если типы А и В разные, то сначала происходит преобразование операнда с младшим типом к старшему типу, затем выполняется операция. Результат получит старший тип.

Числовые типы в порядке возрастания старшинства расположены так:

целый (I) – вещественный (R) – комплексный (C).

Внутри каждого типа старшинство растет с ростом разновидности.

Особенности вычислений с целыми числами.Рассмотрим простую программу:

real(4) c1, c2

c1=3/2; c2= -3/2

print *,c1,c2 ! 1.0 -1.0

End

Операнды – целые числа, поэтому и результат должен быть целым числом - целой частью результата обычного деления. Затем, поскольку c1, c2 имеют тип real(4), целые числа 1 и –1 преобразуются в стандартный вещественный тип.

Если один из операндов сделать вещественным, то результатом деления также будет вещественное число, в данном случае – не равное единице:

c1=3./2 ! 3. – вещественная тройка

с2=float(3)/2 ! float – функция преобразования

! к вещественному типу

print *, c1,c2 ! 1.5 -1.5

Таким образом, чтобы получить правильный результат арифметического деления, достаточно сделать один из операндов формально вещественным.

Особенности возведения в степень. Возведение в целую степень компилятор реализует в виде серии последовательных умножений, а в действительную – через логарифмирование основания, умножение на показатель степени и вычисление показательной функции:

x5=x*x*x*x*x x 1,2 = e 1,2*ln(x)

Тип показателя степени определяется по формальным признакам. Поэтому возведение в степени 2 и 2.0, также в целую степень k и вещественную степень y при одинаковом числовом значении названных переменных будет производиться разными способами.

Для вычисления значения квадратного корня рекомендуется использовать не операцию возведения в степень 0.5, а стандартную функцию sqrt.

Особенности вычислений с разнопорядковыми величинами. Ограниченность разрядности и диапазона чисел, представимых в любой ЭВМ, делает порядок выполнения операций одинакового приоритета не вполне безразличным. Например:

real(4):: a=1.0e+32, b=-1.0e+32, c=7.0

print *,a+b+c ! 7.000000 (верный результат)

print *,a+c+b)! 0.000000E+00 (потеря значимости)

При сложении чисел с существенно различными порядками нужно учитывать возможную потерю значимости меньшего по модулю в процессе выравнивания порядков.

Сложение чисел одного знака во избежание потери точности следует начинать со слагаемых, меньших по модулю. В процессе накопления произведения при неудачном выборе пар сомножителей можно получить переполнение разрядной сетки, или "машинный нуль". Нужно стремиться к тому, чтобы каждое очередное произведение было по модулю возможно ближе к единице.

Встроенные функции.Естественным требованием к языку, ориентированному на научные приложения, является достаточно богатый набор встроенных, т.е. являющихся частью языка, функций и процедур.

Каждая функция имеет родовое и специфическое имя. При использовании родового имени тип функции определяется типом аргумента. Специфическое имя ориентировано на строго определенный тип аргумента и результата. В таблице приведены основные математические функции с родовыми именами. Использованы обозначения типов: I – целый, R – вещественный, C – комплексный.

Наши рекомендации