ЦІЛІ ЗМІННІ

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

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

FOR COUNT% = 1 ТО 500 або в якості індексів масивів: B (I%) = A (L%) +106 або в операторах вибору:

ON SELECT% GOSUB 100, 200, 400, 900 або в умовних виразах: IF Т% = 99 THEN GOSUB 293

При виконанні арифметичних операцій над цілими числами треба використовувати спеціальну операцію цілого ділення, так вона виконується швидше ділення дійсних чисел Ця операція, згадувана в розд 61, позначається зворотною косою межею (\) або службовим словом DIV Перетворення типів даних з речових в цілі вчиняється автоматично при виконанні оператора присвоювання При цьому результат може округляти, наприклад: 10

А% = 98

20 PRINT А% RUN

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

10 А% = 98 20 PRINT А% RUN

Перш ніж користуватися перетворенням типів, зясуйте, яким саме чином Ваша система виконує цю операцію При перенесенні програм з однієї системи на іншу можна гарантувати однакове їх дія тільки в тому випадку, якщо вони самі виконують округлення наприклад, застосування оператора

A%=INT(B+05)

забезпечує перетворення позитивного значення В в найближче більше ціле число, якщо дрібна частина У більше або дорівнює 05, і найближчим меншу ціле число, якщо дрібна частина В

менше 05 У табл 63 перераховані функції, які повертають цілий результат Якщо у Вашій системі функції FIX немає, то замість неї можна використовувати вираз SGN (X) * INT (ABS (X))

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

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

Таблиця 63 Функції, які повертають цілі результати

Функція

Дія

Приклад

INT(X)

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

FIX(X)

Найбільше ціле

&lt= X

Округлення X Відкидання дробової частини X

INT (218) повертає 21

INT (-218) повертає -22

CINT (218) повертає 22

FIX (218) повертає 21 FIX (-218) повертає -21

ческие операції над ними виконуються швидше, ніж над числами, в тлумаченні

керуючих операторів не виникає непорозумінь

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

621 ЗМІННІ з подвійною точністю

У більшості систем з Бейсиком речові числа представляються з точністю до 6-7 значущих цифр в деяких системах точність досягає 11-12 значущих цифр Іноді передбачається функція типу EPS, що повертає найменше значення, для якого справедливі співвідношення

1-EPS&ltK1+EPS

Якщо у Вашій системі такої функції немає, то точність стандартних речових змінних можна визначити, запустивши наступну програму:

10 Е = 1

20 Е = Е / 2

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

40 PRINT точності рівні; Е

50   END RUN

Точності дорівнює 363798Е-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

арифметичні операції також будуть виконані з подвійною точністю, але при присвоєнні точність результату буде зменшена до одинарної Насправді це може бути цілком задовільним, тому що може виявитися, що джерелом численних помилок є тільки арифметичний вираз У деяких системах констант можна приписувати особливий ознака, що показує, що вони мають подвійну точність У цьому випадку 645 # / 712 обчислюється з подвійною точністю, а 645/712-з одинарною У табл 64 наведено дві функції для явного перетворення дійсних чисел з подвійною точністю в речові числа з одинарною точністю і навпаки При дослідженні стійкості чисельних методів нерідко буває корисно мати універсальну підпрограму або функцію для зменшення кількості значущих цифр у значень змінних для вивчення ефекту зниження точності Це зменшення можна реалізувати двома спосо-

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

Функція

Дія

Приклад

CDBL(X)

CSNG(Y)

Перетворює значення з

одинарної точністю X на значення з подвійною точністю Перетворює значення з подвійною точністю Y на значення з одинарної точністю

CDBL (45467)

повертає

4546700134277

CSNG (1234567890) повертає 12345678

бами По-перше, можна просто округлити будь-яке значення до D-й десяткового позиції:

100 REM ПІДПРОГРАМА ОКРУГЛЕННЯ X ДО D-Й десяткових ПОЗИЦІЇ

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

120   RETURN

Таке просте округлення непридатне в багатьох випадках, коли значення сильно розрізняються за абсолютною величиною У цих випадках треба мати справу зі значущими цифрами. Це означає, що незалежно від значення числа треба зберігати певне число цифр, що несуть інформацію про число Наприклад, при округленні до трьох значущих цифр

12345Е + 5 перетвориться на 123Е +5 і

12345Е-10 перетвориться в 123Е-10

Якщо округляемое значення масштабувати так, що воно виявляється в діапазоні 01 .. 1, то після цього можна застосовувати зазначений вище метод округлення таким шляхом приходимо до програми

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

105 REM N значущі цифри

110 IF X=0 THEN RETURN

120 S=10

130 IF ABS(X)&lt1 THEN 170

140   X=X*1

150  S=S*10

160   GOTO 130

170 IF ABS(X)&gt.1 THEN 210

180  X=X*10

190   S=S*1

200   GOTO 170

210 X=INT&ltX*10**N+SGN(X)*5&gt*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 с: ил

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*