Файл: А. Б. Шнейвайс основы программирования.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.12.2023

Просмотров: 316

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

16.1.2
Опции -fdefault-real-8 и -fdefault-double-8
Пусть заранее известно, что работа программы должна будет проверять- ся как в режиме типа real(8), так и в режиме типа real(16). Для реали- зации режима real(16) (в предположении использования только опции
-fdefault-real-8) описания констант и переменных придётся выполнять посредством double precision.
Получение же исполнимого кода в режиме REAL(8) (без внесения каких-либо изменений в исходный текст) достигается совместным указа- нием опций -fdefault-real-8 -fdefault-double-8. Рассмотрим пример:
program treal1; implicit none double precision, parameter :: c=1.3d0
real, parameter :: d=1.4d0
double precision cc real dd write(*,*) ’
c=’,c;
write(*,*) ’
d=’,d cc=c dd=d write(*,*) ’ cc=’,cc; write(*,*) ’ dd=’,dd end
$ gfortran -fdefault-real-8 treal1.f95
$ ./a.out c=
1.30000000000000000000000000000000004
d=
1.3999999999999999
cc=
1.30000000000000000000000000000000004
dd=
1.3999999999999999
• Как видим, описатель double precision привёл к генерация кон- станты c и переменной cc четверной точности.
Результат же исполнимого кода treal1 при совместном действии опций
-fdefault-real-8 -fdefault-double-8 имеет вид:
$ gfortran -fdefault-real-8
-fdefault-double-8 treal1.f95
$ ./a.out c=
1.3000000000000000
d=
1.3999999999999999
cc=
1.3000000000000000
dd=
1.3999999999999999 423

16.2
Опции изменения явно указанных разновидностей
Во многих программах для описания типа вещественных переменных часто встречаться описатели с явно указанной разновидностью:
real*4, real*8, real*16, real(4), real(8), real(10), real(16)
(описатели real или double precision задают разновидность типа неяв- но, т.е. по умолчанию, в зависимости от настройки компилятора, отводя обычно под тип real четыре байта).
Часто, однако, встречаются программы, в которых разновидность ти- па указана явно. Так что иногда возникает необходимость изменить яв- но указанную разновидность типа на другую, причём без явного из- менения исходного текста. Похожая возможность для неявно заданных разновидностей real и double precision реализуется посредством оп- ций -fdefault-real-8 и -fdefault-real-8 -fdefault-double-8 (см. 16.1.1 и
16.1.2).
Явно указанную разновидность типа gfortranизменяет посредством опций
-freal-4-real-10 -freal-4-real-16 -freal-4-real-8
-freal-8-real-10 -freal-8-real-16 -freal-8-real-4
Рассмотрим самую первую программу первого семестра, которая по зна- чению аргумента x = 10
−7
, вычисляет значения переменных y=1+x,
z=y-1, t=z/x, если все переменные описаны как real(4) или real*4.
program treal2
implicit none real(4) x, y !; complex u real*4
z, t x=1e-7;
y=1+x;
z=y-1;
t=z/x !; u=(1.2,3.7)
write(*,*) ’ x=’,x write(*,*) ’ y=’,y write(*,*) ’ z=’,z write(*,*) ’ t=’,t
!write(*,*) ’ z=’,u end
424

1. Результат работы её исполнимого кода, полученного без указания опций:
$ gfortran treal2.f95
$ ./a.out x=
1.00000001E-07
y=
1.00000012
z=
1.19209290E-07
t=
1.19209290 2. Результат работы опции -freal-4-real-8:
$ gfortran -freal-4-real-8 treal2.f95
$ ./a.out x=
9.9999999999999995E-008
y=
1.0000001000000001
z=
1.0000000005838672E-007
t=
1.0000000005838672 3. Результат работы опции -freal-4-real-10:
$ gfortran -freal-4-real-10 treal2.f95
$ ./a.out x=
9.99999999999999999985E-0008
y=
1.00000009999999999995
z=
9.99999999999482205859E-0008
t=
0.999999999999482205859 4. Результат работы опции -freal-4-real-16:
$ gfortran -freal-4-real-16 treal2.f95
$ ./a.out x=
9.99999999999999999999999999999999976E-0008
y=
1.00000010000000000000000000000000002
z=
1.00000000000000000000000000015020405E-0007
t=
1.00000000000000000000000000015020405 5. Если в программе treal2 изменить описания типов на real(8) или real*8, то соответствующий исполнимый код, полученный без ука- зания опций даст результат:
$ gfortran treal28.f95
$ ./a.out x=
1.0000000116860974E-007
y=
1.0000001000000012
z=
1.0000000116860974E-007
t=
1.0000000000000000 425


6. Включение опции -freal-8-real-4 приведёт к результату:
$ gfortran -freal-8-real-4 treal28.f95
$ ./a.out x=
1.00000001E-07
y=
1.00000012
z=
1.19209290E-07
t=
1.19209290 7. Включение опции -freal-8-real-10 приведёт к результату:
$ gfortran -freal-8-real-10 treal28.f95
$ ./a.out x=
1.00000001168609742308E-0007
y=
1.00000010000000116861
z=
1.00000001168609742308E-0007
t=
1.00000000000000000000 8. Опция -freal-8-real-16 получит:
$ gfortran -freal-8-real-16 treal28.f95
$ ./a.out x=
1.00000001168609742308035492897033691E-0007
y=
1.00000010000000116860974230803549290
z=
1.00000001168609742308035492897033691E-0007
t=
1.00000000000000000000000000000000000 426

16.3
Опция -fimplicit-none
Заметим, что, вообще говоря необязательно отключать действие прави- ла умолчания посредством ФОРТРАН-оператора implicit none. Того же можно достичь включением опции компилятора gfortran: -fimplicit- none, которая означает, что не допускается неявное описание типов, ес- ли только в тексте программы не встретится оператор implicit в явной форме.
Например, если из программы treal2 исключить оператор implicit none и описание переменных y и t (допуская действие правила умолча- ния), но компиляцию программы провести с опцией -fimplicit-none, то получим
$ gfortran -fimplicit-none treal3.f95
treal3.f95:3.30:
x=1e-7;
y=1+x;
z=y-1;
t=z/x
1
Error: Symbol ’t’ at (1) has no IMPLICIT type treal3.f95:3.12:
x=1e-7;
y=1+x;
z=y-1;
t=z/x
1
Error: Symbol ’y’ at (1) has no IMPLICIT type aw@burst:/lecture/semestr2/options_gfortran>
427

16.4
Опции -ffixed-line-length-N и -ffree-line-length-N
Опции служат для увеличения длины строки исходного текста, кото- рая воспринимается компилятором (по умолчанию эта длина равна 72
или 132 однобайтовым символам). Конечно, никто специально не будет использовать в своей программе строки большей длины. Однако, при переходе с одного вида кодировки (koi8r) на другой (utf8) превышение допустимого предела может возникнуть неявно. В utf8 коды букв кирил- лицы — двухбайтовые, а koi8r — однобайтовые. Поэтому после упомя- нутого перехода строка кириллицы, занимающая в koi8r только 40 байт,
в utf8 потребует 80, хотя на экране будет выглядеть как 40-буквенная.
Например, исходный текст ФОРТРАН-программы program tlength; implicit none; real dl /1.0/, a0
a0=2*(1-sqrt(1-dl))/dl write(*,’("Точное значение нулевого момента функции)=",e15.7)’) a0
end содержащей кириллицу выглядит на экране вполне безобидно, и в koi8r,
компилируется без ошибок, но в кодировке utf8 получим:
$ gfortran tlutf8.f tlutf8.f:3.14:
write(*,’("\xD0\xA2\xD0\xBE\xD1\x87\xD0\xBD\xD0\xBE\xD0\xB5 \xD0\xB7\xD0\x
BD\xD0\xB0\xD1\x87\xD0\xB5\xD0\xBD\xD0\xB8\xD0\xB5 \xD0\xBD\xD1\x83\xD0\xBB\xD0\
xB5\xD0\xB2\xD0\xBE\xD0\xB3\xD0\xBE \xD0\xBC\xD0\xBE\xD0\xBC\xD0\xB5 1
ошибка: Syntax error in WRITE statement at (1)
• -ffixed-line-length-N устанавливает N — число байт, отводимое под часть строки, воспринимаемой компилятором, если исходный текст имеет фиксированный формат записи.
• -ffree-line-length-N делает то же для свободного формата.
• N можно задать равным none, что означает отсутствие какого-либо ограничения на длину строки (то же самое означает и N=0).
Результат активации tlength, полученной при -ffixed-line-length-108:
$ gfortran tlutf8.f -ffixed-line-length-108
$ ./a.out
Точное значение нулевого момента функции)=
0.2000000E+01 428


Список литературы
[1] Горелик А.М. 2018. Эволюция языка ФОРТРАН.
Устаревшие черты языка и средства для их замены // Препринты
ИПМ им. М.В.Келдыша. 2018. №130. 13 c.
doi:10.20948/prepr-2018-130
URL:http://library.keldysh.ru/preprint.asp?id=2018-130
https://library.keldysh.ru/preprint.asp?id=2018-130
[2] Горелик А.М. 2006. Программирование на современном Фортране. –
М.: Финансы и статистика, – 352 c.
[3] Бартеньев О.В. 1999. Фортран для студентов. – М.:"ДИАЛОГ – МИ-
ФИ – 400 c.
[4] Бартеньев О.В. 2000. Современный ФОРТРАН. "3-е изд., доп. и пе- рераб. – М.; ДИАЛОГ – МИФИ, – 448 c.
[5] Рыжиков Ю.И. 2004. Современный ФОРТРАН: Учебник. – СПб.: КО-
РОНА принт, –288 c.
[6] Немнюгин М.А., Стесик О.Л. 2004. Современный ФОРТРАН: Само- учитель. – СПб.: БХВ-Петербург, 496 с.
[7] Немнюгин М.А., Стесик О.Л. 2008. ФОРТРАН в задачах и примерах многопроцессорных вычислительных систем. – СПб.: БХВ-Петербург,
320 с.
[8] Касаткин А.И., Вальвачев А.Н. 1992. Профессиональное программи- рование на языке СИ: От Тurbo C к Borland C++: Справ. пособие;
Под общ. ред. А.И. Касаткина. – Мн.: Выш.шк., – 240 c.
[9] Шилдт Г. 2002. - Самоучитель С++: Пер. с англ. – 3-е изд. – CПб.:
БХВ–Петербург, – 688 с.
[10] Клюшин Д.А. 2004. Полный курс С++. Профессиональная работа.
– М.: Издательский дом “Вильямс” – 624 c. : ил.
[11] Игнатов В. 2000. Эффективное использование GNU Make.
429

[12] Richard M.Stallman, Roand McGrath
GNU Make Программа управления компиляцией.
GNU make Версия 3.79 Апрель 2000. перевод (C) Владимира Игнатова http://linux.yaroslavl.ru/docs/prog/gnu_make_3.79_russian_manual.html
[13] Левин М. 2005. СИ++: Самоучитель / Максим Левин. – М.: ЗАО
“Новый издательский дом”, – 176c.
[14] Д.Кнут 2007. - Искусство программирования для ЭВМ т. 2. Полу- численные алгоритмы (полиномиальная арифметика) 833 c.
[15] Гашков С.Б. 2014 Сложение однобитных чисел. Треугольник Паска- ля, салфетка Серпинского и теорема Куммера. — Издательство Мос- ковского центра непрерывного математического образования, — 40с.
[16] Генри Уоррен, мл. 2003 Алгоритмические трюки для программистов.
Издательский дом ”Вильямс“; Москва; Санкт-Петербург; Киев; 285c.
алгоритмы.
[17] Вирт Н., Алгоритмы + структуры данных = программы:
Пер. с англ. – М.: Москва, Мир, 1985. – 406 с., ил.
[18] Дмитриева М.В. Кубенский А.А. Элементы современного програм- мирования: Учеб. пособие/Под ред. С.C. Лаврова. – СПб.: Издатель- ство С.–Петербургского университета, 1991. – 272 с.
[19] Гутер Р.С., Полунов Ю.Л. От абака до компьютера. — 2-е изд., испр.
и доп. — М.: Знание, 1981. — 208 с. + 32 c. вкл. (Библиотека «Знание»)
[20] www.vbstreets.ru/VB/Articles/66541.aspx
[21] «Нежданчики» языка ФОРТРАН.
https://habr.com/en/company/intel/blog/254235/
430