Assembler - язык неограниченных возможностей


Вычисления с плавающей запятой - часть 2


или, сделав замену у = х',

у = у + h(m(1-x2)y - х) х = х + hy

Это уравнение интересно тем, что его решение для всех m > 0 оказывается периодическим аттрактором, так что, если из-за ошибок округления решение отклоняется от истинного в любую сторону, оно тут же возвращается обратно. При m = 0, наоборот, решение оказывается неустойчивым и ошибки округления приводят к очень быстрому росту х и у до максимальных допустимых значений для вещественных чисел.

Эту программу нельзя реализовать в целых числах или числах с фиксированной запятой, потому что значения х и х' различаются на много порядков — кривая содержит почти вертикальные участки, особенно при больших m.

; vdp.asm ; решение уравнения Ван-дер-Поля ; x(t)" = -x(t) + m(1-x(t)2)x(t)' ; с m = 0, 1, 2, 3, 4, 5, 6, 7, 8 ; ; программа выводит на экран решение с m = 1, нажатие клавиш 0 - 8 изменяет m ; Esc - выход, любая другая клавиша - пауза до нажатия одной из Esc, 0 - 8

.model tiny .286 ; для команд pusha и рора .287 ; для команд FPU .code org 100h ; СОМ-программа

start proc near cld push 0A000h pop es ; адрес видеопамяти в ES mov ax,0012h int 10h ; графический режим 640x480x16 finit ; инициализировать FPU xor si, si ; SI будет содержать координату t и меняться ; от 0 до 640 fld1 ; 1 fild word ptr hinv ; 32, 1 fdiv ; h (h = 1/hinv) ; установка начальных значений для _display: ; m = 1, x = h = 1/32, у = х' = 0 again: fild word ptr m ; m, h fld st(1) ; x, m, h (x = h) fldz ; y, x, m, h (y = 0) call _display ; выводить на экран решение, пока ; не будет нажата клавиша g_key: mov ah,10h ; чтение клавиши с ожиданием int 16h ; код нажатой клавиши в AL, cmp al,1Bh ; если это Esc, jz g_out ; выйти из программы, cmp al,'0' ; если код меньше "0", jb g_key ; пауза/ожидание следующей клавиши, cmp al,'8' ; если код больше "8", ja g_key ; пауза/ожидание следующей клавиши, sub al,'0' ; иначе: AL = введенная цифра, mov byte ptr m,al ; m = введенная цифра fstp st(0) ; x, m, h fstp st(0) ; m, h fstp st(0) ; h jmp short again




Начало  Назад  Вперед