nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 14:06



Reply to topic  [ 245 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13, 14 ... 17  Next
Электроника МК-85 
Author Message
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
результат тестов:
Code:
DEG SIN 1e-2047 :ERR3 P9-30
RAD SIN 1e-2049 :ERR3 P9-30
GRA SIN 1e-2047 :ERR3 P9-30

DEG COS 1e-2047 :ERR3 P9-30
RAD COS 1e-2049 :ERR3 P9-30
GRA COS 1e-2047 :ERR3 P9-30

DEG TAN 1e-4094 : OK!
RAD TAN 1e-4094 : OK!
GRA TAN 1e-4094 : OK!

сообщение об ошибке ссылается на эту программу теста:
Code:
10 DEFM 0:SET 10:A=1e-1
20 MODE 5 // MODE 4, MODE 6
30 B=TAN A // B=SIN A, B=COS A
40 CSR 0,:PRINT A;
50 IF A=1e-4094; PRINT " OK!"
60 A=A*1e-1
70 GOTO 30


вначале огорчился, что функции SIN, COS таки не исправились, но всё не так как на самом деле...
если посмотреть в комментах https://gitlab.com/nedopc/mk85/blob/mas ... e/mk85.src формулы вычисления SIN, COS через TAN

Code:
SIN(x) =  TAN(x) / SQR(1+TAN(x)^2)
COS(x) = 1 / SQR(1+TAN(x)^2)

и попробовать вычислить в режиме калькулятора , например DEG TAN(1e-2047)^2, то - таки, ERR3.
т.е. это не разрушающий баг, а фича формулы вычисления SIN, COS и сабж адекватно на неё реагирует, воспроизводя сообщение об ошибке, что результат вычислений превысил допустимые границы представления чисел.

~~~~~~~~~~~~~~~~~~~~~~~
итого в сухом остатке:
32-х летний баг ликвидирован.
всем спасибо.
я счастлив. :mrgreen:
~~~~~~~~~~~~~~~~~~~~~~~


14 Aug 2018 20:53
Profile
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
да, и забыл пока тестил главное - запуск TEST вызывает сообщение "Дефект ПЗУ".
особо не принципиально, но...

Code:
;calculated checksum
;ckecksum OK

не окей.


14 Aug 2018 21:38
Profile
Novelist
User avatar

Joined: 14 Aug 2018 14:30
Posts: 49
Location: Szczecin, Польша
Reply with quote
Я забыл обновить контрольную сумму. Исправил, файл rom_image.zip обновлён.
Спасибо за проверку!


14 Aug 2018 22:12
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433 wrote:
Я забыл обновить контрольную сумму. Исправил, файл rom_image.zip обновлён.
Спасибо за проверку!

спасибо - теперь всё ОК.


14 Aug 2018 22:55
Profile
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
пока народ не разбежался - есть ещё вопрос:

претензии чисто косметического характера.

делаем 0.001 EXE - результат: 0.001
делаем 0.0001 EXE - результат: 1e-4

вопрос:
почему результат выполнения 0.1 EXE не 1e-1 ?
или
почему результат выполнения 0.000000001 EXE не 0.000000001 ?

в чём сакральная суть перехода на формат 1e-x представления числа начиная с x>3, а не сразу или когда число перестаёт помещаться в экран?


15 Aug 2018 02:42
Profile
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433, Shaos, нужно где-то опубликовать исправленную версию ROM.
с подробным описанием исправленного.
т.к. баг довольно критический и подозреваю, что многие на него наступали, но не понимали, что вообще происходит.


15 Aug 2018 18:22
Profile
Novelist
User avatar

Joined: 14 Aug 2018 14:30
Posts: 49
Location: Szczecin, Польша
Reply with quote
К сожалению, моя модификация портит функцию EXP :(
Я ещё подумаю.


16 Aug 2018 03:11
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
ок. не буду мешать.


16 Aug 2018 03:45
Profile
Novelist
User avatar

Joined: 14 Aug 2018 14:30
Posts: 49
Location: Szczecin, Польша
Reply with quote
Кстати, с оригинальным ПЗУ, функция ATN тоже выдаёт неправильные результаты для аргументов < ±1E-127


16 Aug 2018 13:29
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433 wrote:
Кстати, с оригинальным ПЗУ, функция ATN тоже выдаёт неправильные результаты для аргументов < ±1E-127

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

Code:
10 DEFM 0:SET 10:A=1e-1
20 MODE 5
30 B=ATN A
40 CSR 0,:PRINT A;
50 IF A=1e-4096; PRINT " OK!"
60 A=A*1e-1
70 GOTO 30

этот тест функция ATN проходит.

для проверки правильности вычислений нужно дописать в эмулятор подключение к эталонному программному вычислителю и сравнивать, переменную B из теста с external_B вычислителя.

или иначе, что бы вызов из консоли
Code:
mk85m RAD ATN(1e-127)

возвращал результат ATN(1e-127) вычисленный эмулятором.
тогда будет проще работать с эталонным вычислителем.


16 Aug 2018 18:40
Profile
Novelist
User avatar

Joined: 14 Aug 2018 14:30
Posts: 49
Location: Szczecin, Польша
Reply with quote
Может так будет лучше:
Code:
3A9E: jmp @#3FEA

3FEA: mov 10(sp),r0
3FEE: cmp r0,#FFC0
3FF2: bpl 3FF8
3FF4: mov #FFC0,r0
3FF8: sub r0,r1
3FFA: jmp @#3A48


Quote:
для проверки правильности вычислений нужно дописать в эмулятор подключение к эталонному программному вычислителю и сравнивать, переменную B из теста с external_B вычислителя.

Попытаюсь дописать.


Attachments:
rom_image.zip [12.21 KiB]
Downloaded 251 times
16 Aug 2018 21:39
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433 wrote:
Попытаюсь дописать.

что бы особо не заморачиваться - пусть PRINT просто печатает в текстовый файл print.txt, лежащий в папке с исполняемым файлом эмулятора, где CSR будет указывать - с какого места новой строки печатать, если CSR не выполняется, то - печатать всё подряд.


16 Aug 2018 22:35
Profile
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433 wrote:
Может так будет лучше:

ок. спасибо.

на первый взгляд - всё хорошо.

*тут ещё проблема найти эталонный вычислитель, т.к. виндовый дефолтный калькулятор делает градус sin(1e-200) = 0
поэтому, прошу пока подаяний на паперти http://www.wolframalpha.com


16 Aug 2018 23:47
Profile
Novelist
User avatar

Joined: 14 Aug 2018 14:30
Posts: 49
Location: Szczecin, Польша
Reply with quote
Quote:
на первый взгляд - всё хорошо

Я всё-таки решил сделать это ещё раз по-другому. Недостатки оригинального кода в диапазоне адресов 0x3A30-0x3AA2 возникают из-за хранения двух информации в одном регистре R1:
1. бит 15 - флаг требования дополнительного сдвига на одну цифру
2. младший байт - количество сдвигов на две цифры (здесь наступает переполнение)
Я переписал всю проблематическую подпрограмму. Приведённая модификация хранит количество сдвигов в полном 16-битном регистре R1, а флаг хранится на стеке.
Code:
; function used by the EXP and LN procedures, M=B*10^(-J+offset)
   sub   #7,r5      ;r5 points to the multiplicand B
   mov   r5,r2
   sub   #8,r2      ;r2 points to the modifier M
   movb   (sp),r1      ;iteration counter J
   sub   10(sp),r1   ;offset to the table of constants
   asr   r1
   ror   -(sp)      ;mark odd (-J+offset)
; M = B/10^(2*r1)
L3A48:   mov   #8,r0
L3A4C:   tst   r1
   ble   L3A54
   clrb   (r2)
   br   L3A62
L3A54:   movb   (r5),(r2)
   dec   r5
   bit   #1,r5
   beq   L3A62
   add   #4,r5
L3A62:   dec   r2
   bit   #1,r2
   beq   L3A6E
   add   #4,r2
L3A6E:   dec   r1
   sob   r0,L3A4C
;
   tst   (sp)+
   bpl   L3A8A      ;skip if (-J+offset) is even
; M = M/10
   dec   r2
   mov   #4,r0
L3A7C:   sub   #8,r2
   ror   (r2)+
   ror   (r2)+
   ror   (r2)+
   ror   (r2)+
   sob   r0,L3A7C
;
L3A8A:   mov   r3,r5
   sub   #A,r5
   jmp   @(r4)+

; function used by the TAN and ATN procedures, M=A*10^(-2*J+offset)
   add   #3,r5
   mov   r5,r2
   sub   #12,r2
   movb   (sp),r1      ;iteration counter J
   sub   10(sp),r1   ;offset to the table of constants
   clr   -(sp)
   br   L3A48


Quote:
что бы особо не заморачиваться - пусть PRINT просто печатает в текстовый файл print.txt, лежащий в папке с исполняемым файлом эмулятора, где CSR будет указывать - с какого места новой строки печатать, если CSR не выполняется, то - печатать всё подряд.

Но это не будет просто. Эмулятор ничего не знает про команды Бейсика PRINT или CSR, может лишь нажимать кнопки, записывать и читать память (например буфер строковой переменной $), перехватить данные для контроллера ЖКИ.

Quote:
виндовый дефолтный калькулятор делает градус sin(1e-200) = 0

Для малых величин X, sin(X) = X и tan(X) = X (в радианах).

Quote:
прошу пока подаяний на паперти

Ой, прошу пояснения.


Attachments:
rom_image.zip [12.2 KiB]
Downloaded 281 times


Last edited by piotr433 on 17 Aug 2018 11:30, edited 2 times in total.

17 Aug 2018 08:06
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 08:48
Posts: 413
Reply with quote
piotr433 wrote:
Недостатки оригинального кода в диапазоне адресов 0x3A30-0x3AA2 возникают из-за хранения двух информации в одном регистре R1:

понятно. спасибо за развёрнутый ответ о причине бага и способе его решения.

piotr433 wrote:
Но это не будет просто. Эмулятор ничего не знает про команды Бейсика PRINT или CSR...

ок. ну, тогда ничего сделать и не получится - если эмулятор управляет чёрным ящиком.

piotr433 wrote:
Для малых величин X, sin(X) = X и tan(X) = X (в радианах).

и, в радианах майкрософт считает 1e-200 достаточно малой величиной, что бы приравнивать её к 0.

piotr433 wrote:
Ой, прошу пояснения.

там у них считается всё коммерческим и если проявлять чрезмерную активность запросов, то они ничего не говорят, а начинают сокращать варианты выдаваемых ответов.
поэтому я стараюсь не наглеть.


17 Aug 2018 10:51
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 245 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13, 14 ... 17  Next

Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.