Главная » Basic » ЦЕЛЫЕ ПЕРЕМЕННЫЕ

0

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

такой диапазон вполне адекватен большинству приложений этих переменных, например применению их в качестве счетчиков циклов:

FOR COUNT% = 1 ТО 500 или в качестве индексов массивов: B(I%) =A(L%) +10.6 или в операторах выбора:

ON SELECT% GOSUB 100, 200, 400, 900 или в условных выражениях: IF Т% = 99 THEN GOSUB 293

При выполнении арифметических операций  над целыми числами надо использовать специальную операцию целого деления, так она выполняется быстрее деления вещественных чисел. Эта операция, упоминавшаяся в разд. 6.1, обозначается обратной косой чертой (\) или служебным словом DIV. Преобразование типов данных из вещественных  в целые совершается автоматически  при выполнении  оператора присваивания. При этом результат может округляться, например: 10

А%=9.8

20   PRINT А% RUN

10 или у результата может отбрасываться дробная часть, например:

10   А%=9.8 20   PRINT А% RUN

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

A%=INT(B+0.5)

обеспечивает преобразование положительного значения В в ближайшее большее целое число, если дробная часть В больше или равна  0.5, и в ближайшее меньшее целое число, если дробная часть В

меньше 0.5. В табл. 6.3 перечислены  функции, возвращающие целый результат. Если  в Вашей системе функции FIX нет, то вместо нее можно использовать выражение SGN(X)*INT(ABS(X))

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

так как при этом требуется меньше памяти, арифмети180

Таблица 6.3. Функции, возвращающие целые результаты

Функция

Действие

Пример

INT(X)

Только в Бейсике Microsoft CINT(X)

FIX(X)

Наибольшее целое

<= X

Округление X Отбрасывание дробной части X

INT(21.8) возвращает 21

INT(-21.8) возвращает -22

CINT(21.8) возвращает 22

FIX (21.8) возвращает 21 FIX (-21.8) возвращает -21

ческие операции над ними выполняются быстрее, чем над вещественными числами,  в  толковании

управляющих операторов не возникает недоразумений.

В  Бейсике ВВС  целые  переменные  только  на  один байт  короче  вещественных переменных  и занимают по  четыре  байта,  что  позволяет хранить значения в   диапазоне ±2  *1012.  При этом переменные с А% по Z% представляют собой особый случай: в них  можно сохранять значения при переходе  от  одной  программы  к  другой  с  помощью  команды  CHAIN;  кроме  того,  их  можно использовать при работе с присоединяемыми процедурами.

6.2.1.  ПЕРЕМЕННЫЕ С ДВОЙНОЙ ТОЧНОСТЬЮ

В  большинстве систем с  Бейсиком вещественные числа представляются с  точностью  до  6—7 значащих  цифр;  в    некоторых  системах точность  достигает 11—12  значащих  цифр.  Иногда предусматривается  функция типа EPS, возвращающая    наименьшее значение,      для     которого справедливы соотношения

1-EPS<K1+EPS

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

10  Е=1

20   Е=Е/2

30   IF   (1-E)<1  AND   1<(1+Е)  THEN   20

40   PRINT "ТОЧНОСТЬ РАВНА";Е

50   END RUN

ТОЧНОСТЬ РАВНА 3.63798Е-12

END AT LINE 50

Полученный результат говорит о том, что точность достигает 11—12 значащих Цифр. Если операция AND в Вашей системе отсутствует, то строку 30 можно заменить на оператор IF (1 —Б) < 1 THEN 20. Результатом исполнения этой программы на персональной ЭВМ ВВС будет 1.16Е-10. Если  в Вашей системе предусмотрены  переменные  с  двойной  точностью,  то  для  определения их   точности приведенную выше программу надо исполнить, заменив в ней Е на Е#.

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

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

D# = A/B*C

не обеспечит большей точности, чем оператор

D = A/B*C

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

D# = A#/B*C

и арифметические операции, и результат будут иметь двойную точность; при выполнении оператора

D = A#/B*C

арифметические  операции  также  будут  выполнены с  двойной точностью, но  при присваивании точность  результата  будет  уменьшена  до  одинарной. На  самом  деле  это  может  быть   вполне удовлетворительным, так как может оказаться, что источником численных  ошибок является только арифметическое выражение. В некоторых системах константам можно приписывать особый признак, показывающий, что они имеют двойную  точность. В этом случае 6.45#/7.12 вычисляется с двойной точностью, а 6.45/7.12 -с одинарной. В табл. 6.4 приведены  две функции для явного преобразования вещественных чисел с двойной точностью в вещественные числа с одинарной точностью и наоборот. При исследовании устойчивости численных  методов  нередко бывает полезно иметь универсальную подпрограмму или  функцию для уменьшения  числа значащих цифр у  значений переменных для изучения эффекта снижения точности. Это уменьшение можно реализовать двумя спосо-

Таблица 6.4. Функции Бейсика Microsoft для преобразования значений с двойной точностью

Функция

Действие

Пример

CDBL(X)

CSNG(Y)

Преобразует значение с

одинарной точностью X в значение с двойной точностью Преобразует значение с двойной точностью Y в значение с одинарной точностью

CDBL (454.67)

возвращает

454.6700134277

CSNG (1.234567890) возвращает 1.2345678

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

100   REM ПОДПРОГРАММА ОКРУГЛЕНИЯ X ДО D-Й ДЕСЯТИЧНОЙ ПОЗИЦИИ

110   X = INT(X*10**D+SGN(X)*.5)/10**D

120   RETURN

Такое простое округление непригодно во  многих случаях, когда значения сильно различаются по абсолютной величине. В этих случаях надо иметь дело со "значащими цифрами". Это означает, что независимо от значения числа надо сохранять определенное число цифр, несущих информацию о числе. Например, при округлении до трех значащих цифр

1.2345Е + 5 превратится в 1.23Е+5 и

1.2345Е-10 превратится в 1.23Е-10

Если округляемое значение масштабировать так, что оно оказывается в диапазоне 0.1 … 1, то после этого можно применять указанный выше метод округления; таким путем приходим к программе

100 REM ПОДПРОГРАММА СНИЖЕНИЯ ТОЧНОСТИ X ДО

105 REM N ЗНАЧАЩИХ ЦИФР

110 IF X=0 THEN RETURN

120 S=1.0

130 IF ABS(X)<1 THEN 170

140   X=X*.1

150  S=S*10

160   GOTO 130

170 IF ABS(X)>.1 THEN 210

180  X=X*10

190   S=S*.1

200   GOTO 170

210 X=INT<X*10**N+SGN(X)*.5>*S/10**N

220 RETURN

Если в   системе присутствует функция для  вычисления  log10,  то  ее  можно  использовать для масштабирования X вместо  двух циклов в приведенной выше программе. Другой способ уменьшения точности представления значе-

ния X — преобразовать его в строку символов  и обработать как последовательность символов. Следите   за  тем,  чтобы  при  уменьшении числа  значащих цифр  арифметические   выражения обрабатывались должным образом. Например, выражение

надо заменить на следующий фрагмент:

50   Х = В(I)-Т

60   GOSUB 100

70   X = X/A(I,J)

80   GOSUB 100

90   Y(I) =X

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии