Приколи від адміна (pascal)

PS. (Не стільки совість замучила, скільки підсвідомість повернулося).
Вирішив перевірити наскільки дав реальні поради по реальному типу:

"2") виявилося, що локальне приведення типу integer-> real в TurboPascal
не працює (в моїй голові це глюк- з MatLab'а, інші мови
і загальної ідеології компіляції арифметичних виразів зі змішаними, але сумісними, типами даних).

"1") з проміжними переменнимі- все в порядку
(Як власне написав ще вчора Anton Golub (DoVe)):

додамо на початку:

function test (dx, dy: Real): Real;
Begin
test: = dx * dx + dy * dy;
End;

і вбудуємо рядок з викликом:

+) Приклад "не спрацює" якщо компілювати з ключами.
До обчислення кв.корня з'явиться помилка переповнення.
Мабуть, вони (ключі) були у Вас скинуті.

Не забувайте і про TurboDebagger'е, він проявить всі деталі.
при:

PROGRAM.16: d: = dx * dx + dy * dy;
cs: 00D1> A15A00 mov ax, [PROGRAM.DY]
cs: 00D4 F7265A00 mul word ptr [PROGRAM.DY]
cs: 00D8 8BC8 mov cx, ax
cs: 00DA A15800 mov ax, [PROGRAM.DX]
cs: 00DD F7265800 mul word ptr [PROGRAM.DX]
cs: 00E1 03C1 add ax, cx
cs: 00E3 99 cwd
cs: 00E4 9A3636CC67 call 67CC: 3636; перетворення до real
cs: 00E9 A35C00 mov [PROGRAM.D], ax
cs: 00EC 891E5E00 mov [005E], bx
cs: 00F0 89166000 mov [0060], dx
PROGRAM.18: d: = sqrt (d);

при:
PROGRAM.16: d: = dx * dx + dy * dy;
cs: 00DF> A15A00 mov ax, [PROGRAM.DY]
cs: 00E2 F72E5A00 imul word ptr [PROGRAM.DY]
cs: 00E6 7105 jno 00ED
cs: 00E8 9AC702CE67 call 67CE: 02C7; догляд на крики №215
cs: 00ED 8BC8 mov cx, ax
cs: 00EF A15800 mov ax, [PROGRAM.DX]
cs: 00F2 F72E5800 imul word ptr [PROGRAM.DX]
cs: 00F6 7105 jno 00FD
cs: 00F8 9AC702CE67 call 67CE: 02C7
cs: 00FD 03C1 add ax, cx
cs: 00FF 7105 jno 0106
cs: 0101 9AC702CE67 call 67CE: 02C7
cs: 0106 99 cwd
cs: 0107 9A3636CE67 call 67CE: 3636
cs: 010C A35C00 mov [PROGRAM.D], ax
cs: 010F 891E5E00 mov [005E], bx
cs: 0113 89166000 mov [0060], dx
PROGRAM.18: d: = sqrt (d);

Паскаль хоча і відноситься (номінально) до навчальних мов вимагає
обережності і точного усвідомлення - чого і як програміст хоче зробити
(Тобто передбачає швидше професійного програміста).
(Інакше виходить GIGO - "Garbage In Garbage Out").

В даному прикладі, якщо потрібно, щоб dx була оголошена integer,
то треба використовувати: або проміжні ячеёкі типу real
(І множити їх),
або локальне приведення типу: d: = real (dx) * dx + real (dy) * dy;

Походу прикол в тому, що dx * dx> ніж максимальне значення integer. І в результаті змінна d в ​​рядку d: = dx * dx + dy * dy (d: = 200 * 200 + 0 * 0) = 40 000 при максимально допустимий 32 768. різниця в 7 232. При переповненні число приминає значення -32 768 (мінімальне значення) + 7 232 що дорівнює -25536 (чому і так само власне d до спроби добути з нього корінь). А оскільки комплексних чисел паскаль не знає добути корінь у нього не получається

при заміні всіх чисел на дійсні все працює нормально. а так при розрахунку перменная "де" відбувається неприпустима операції при роботі з числами з плаваючою комою. чомусь поки не зрозуміло. можливо при перетворенні значень цілих чисел в дійсне відбувається така помилка.

Нове в бібліотеці

Краще на сайті

Анекдоти і фрази

"Я завжди говорю неправди. І спробуйте спростувати що це не так."

На сайті всього: 2

Приколи від адміна (pascal)

Приколи від адміна (pascal)