Материал: Аверянов Введение в оператсионные системы и основы программирования 2015

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Идеальный и наиболее быстрый, с точки зрения работы программы, вариант, когда переменная слева от оператора присваивания (ПЕР) и объект справа от него (ВЫР) являются данными одного типа, с одним значением параметра разновидности типа KIND. В противном случае автоматически будет произведена процедура преобразования типа в соответствии с табл. 3.2. Таким образом, результат вычисления выражения преобразуется к типу переменной, с соответствующим параметром разновидности KIND, с использованием стандартных функций Фортрана: INT, REAL, CMPLX и KIND, приведенных в разд. 4.

Таблица 3.2. Преобразование типов при выполнении присваивания

Тип переменной

Преобразование выражения

INTEGER

INT( ВЫР, KIND=KIND(ПЕР))

REAL

REAL( ВЫР, KIND=KIND(ПЕР))

COMPLEX

CMPLX(ВЫР, KIND=KIND(ПЕР))

Вывод в отношении вышесказанного и дальнейших рассуждений довольно простой – необходимо следить за соответствием типов при написании выражений и присваиваний.

3.4.2. Арифметика Фортрана

Для числовых типов Фортрана (INTEGER, REAL и COMPLEX) всех разновидностей (см. п. 3.3.4) определены арифметические операции (табл. 3.3) и скобочные конструкции, соответствующие стандартным (математическим) правилам арифметики.

Таблица 3.3. Арифметические операторы Фортрана

Оператор

Операция

 

Приоритет

( )

Выражение в скобках

1

– макс.

**

Возведение в степень

2

 

*

Умножение

3

 

/

Деление

3

 

+

Сложение или унарный плюс

4

– мин.

Вычитание или унарный

4

– мин.

минус

 

 

 

 

 

 

161

 

 

С помощью арифметических операций со скобочными конструкциями и числовых объектов данных (переменных, а также буквальных и именованных констант) можно программировать ариф-

метические выражения любой сложности.

Операторы «+» и «–», представленные ранее, могут применяться для унарных операций, например для выражений именованными объектами как: +Z или X**(–Y), или буквальными константами числовых типов: – (–1). Отметим, что в последнем случае унарный минус применяется к буквальной константе «–1», для которой ее знак является неотъемлемой частью.

Вернемся к бинарным операциям (сложению, вычитанию, умножению и делению). Наивысшим приоритетом (в 1-ю очередь) при вычислении арифметических выражений обладают скобочные конструкции. Если имеет место вложенность скобочных конструкций, то сначала будет произведен расчет выражений во внутренних скобках. Между собой скобочные конструкции имеют равный приоритет, т.е. вычисляются по мере их появления в выражении.

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

Приоритет арифметических вычислений рассмотрен на примере вычисления арифметического выражения:

A + B / (C / D) – E**F*(G – H*(I+J))

Сначала на печать выводится расчет по единой формуле, а затем разбирается ее пошаговое вычисление (пример 3.51). Критерием правильности пошаговых вычислений является их совпадение с результатом, полученным по единой формуле.

Пример 3.51. Приоритет возведения в степень (вариант 1) program STEPCALC

real :: A=9., B=8., C = 7., D = 6., E = 5., F = 4., G = 3., H = 2., I = 1. , J = 2. print*, A + B / (C / D) – E**F*(G – H*(I+J)) ! ОДНОЙ ФОРМУЛОЙ

! A + B / (C / D) – E**F*(G – H*(I+J)) ПО ШАГАМ:

162

!В выражении три равноценных слагаемых: A, B / (C / D) и – E**F*(G – H*(I+J))

!Вычисление слагаемого B / (C / D) начинается со скобок (C / D), затем деление

STEP1 = C / D; STEP2 = B / STEP1

!Вычисление E**F*(G – H*(I+J)) начинается со скобок (G – H*(I+J))

!Расчет (G – H*(I+J)) начинается со скобок (I+J), далее умножение и вычитание

STEP3 = I+J; STEP4 = H*STEP3; STEP5 = G – STEP4

!Степень E**F вычисляется после скобок, затем производится умножение

STEP6 = E**F; STEP7 = STEP6* STEP5 ! Осталось сложить результаты

RESULT = A + STEP2 – STEP7 print*, RESULT

end

Необходимо отметить важную особенность операции возведения в степень. Например, вычисление выражения A**B**C (пример 3.52), так же как вычисление выражения с любым количеством последовательных возведений в степень, всегда выполняется справа налево. Таким образом, сначала будет вычислено B**C, а полученный результат послужит степенью, в которую будет возведено

A.

Пример 3.52. Приоритет возведения в степень (вариант 2) program POWCALC

real :: A=4., B=3., C = 2.

print*, A**B**C !Возведение в степень одним выражением

! Пошаговое вычисление последовательных возведений в степень

STEP1 = B**C; STEP2 = A**STEP1 print*, STEP2

end

Важнейшим вопросом компьютерных вычислений является преобразование типов данных, одновременно присутствующих в арифметических выражениях. Арифметическое выражение может содержать операнды нескольких числовых типов Фортрана. При этом операнды всегда попарно связаны арифметическими операциями. Перед выполнением каждой арифметической операции операнды проверяются на соответствие типов, и если типы операндов (включая KIND) совпадают, то результат будет того же типа.

Если же типы (или KIND при совпадении типов) различны, то перед выполнением операции производится сравнение типов операндов. Операнд с более мощным типом никак не преобразуется, а операнд с менее мощным типом преобразуется к более мощному

163

типу, таким же будет и тип результата операции. Мощность числового типа возрастает по цепочке INTEGER–REAL–COMLEX, а в пределах каждого типа растет с увеличением значения параметра разновидности KIND.

Зависимость типа результата арифметической операции, если это сложение, вычитание, умножение или деление, в зависимости от типов операндов представлена в табл. 3.4, а операции возведения в степень соответствует табл. 3.5.

Таблица 3.4. Таблица преобразования типов операндов для сложения, вычитания, умножения и деления

Тип

Тип

Преобразование типа

Преобразование типа

 

Тип

ре-

A

B

для A

для B

 

зультата

I

I

A

B

 

I

 

I

R

REAL (A, KIND(B))

B

 

R

 

I

C

CMPLX (A, 0, KIND(B))

B

 

C

 

R

I

A

REAL (B, KIND(A))

 

R

 

R

R

A

B

 

R

 

R

C

CMPLX (A, 0, KIND(B))

B

 

C

 

C

I

A

CMPLX (B, 0, KIND(A))

 

C

 

C

R

A

CMPLX (B, 0, KIND(A))

 

C

 

C

C

A

B

 

C

 

 

Таблица 3.5. Таблица преобразования типов операндов

 

 

 

 

для операции возведения в степень

 

 

 

 

 

 

 

 

 

Тип

Тип

Преобразование типа

Преобразование типа

 

Тип

ре-

A

B

для A

для B

 

зультата

I

I

A

B

 

I

 

I

R

REAL (A, KIND(B))

B

 

R

 

I

C

CMPLX (A, 0, KIND(B))

B

 

C

 

R

I

A

B

 

R

 

R

R

A

B

 

R

 

R

C

CMPLX (A, 0, KIND(B))

B

 

C

 

C

I

A

B

 

C

 

C

R

A

CMPLX (B, 0, KIND(A))

 

C

 

C

C

A

B

 

C

 

В табл. 3.4 и 3.5 в первых двух столбцах жирным шрифтом обозначены исходные типы операндов, а в последнем столбце тип ре-

зультата операции (I – INTEGER, R – REAL, C – COMPLEX). Опе-

164

ранды арифметической операции обозначены как A – первый операнд и B – второй операнд.

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

Пример 3.53 дает наглядное представление о преобразовании типов операндов в простейших арифметических выражениях.

Пример 3.53. Преобразование типов и тип результата program CONVERTYPE

integer :: a=1; real :: b=1.; complex :: c=(1. , 1.) print*, a*a !Результат INTEGER

print*, a*b !Переменная A преобразуется в REAL. Результат REAL

print*, a*с !Переменная A преобразуется в COMPLEX. Результат COMPLEX print*, b*b ! Результат REAL

print*, b*с !Переменная B преобразуется в COMPLEX. Результат COMPLEX print*, c*с ! Результат COMPLEX

end

Интересным разделом компьютерных вычислений является целочисленная арифметика (она соответствует первым строчкам табл. 3.4 и 3.5). Особенно «парадоксальным» образом это проявляется при операциях целочисленного деления. Казалось бы, простой вопрос: сколько будет один делить на два? Вроде бы очевидно, что нуль целых пять десятых. Но запрограммируйте это действие с целыми числами, и такого результата не будет, а будет нуль.

При делении целых операндов результат округляется до целого значения, путем отбрасывания дробной части. Особенность деления целых операндов показана в примере 3.54.

Пример 3.54. Особенности деления целых чисел program INTDIV

print*,1/2!Результат=0 (целочисленное деление)

print*,1./2

!Результат=0.5, поскольку1. – вещественное число

print*,3/2!Результат=1(целочисленное деление)

print*,3./2

!Результат=1.5, поскольку3. – вещественное число

print*,3/2*2

!Результат=2 (целочисленное деление)

print*,3./2*2

!Результат=3.

print*,1/2*2

!Результат=0

print*,1./2*2

!Результат=1.

end

 

 

165

Источник: https://studfile.net/preview/16708824/