Решил потестить точность и правильность короткого умножения.
В EmuZWin написал небольшой тест
Код: org #4000entrypoint $diLD BC,512loopcall #e434OUT(#FE),Ainc cjp nz,loopinc bjp nz,loopexit haltjp exit
откомпилировал, и сохранил состояние в формате *.Z80.
В DelphiSpec добавил при выводе в порт 254 код
Код: frmRam.Log.Lines.Append(IntToStr(regB)+#9+IntToStr(regC)+#9+IntToStr(regA*256)+#9+IntToStr(regB*regC)+#9+IntToStr(regB*regC-regA*256));
прогнал сохранюшку, и перекопировал результат в Ексель, и там посортировал и поанализировал.
[b]Результат[/b]: процедура работает относительно стабильно - гиганской погрешности в некоторых "пасхальных" сочетаниях не выявлено.
Наибольшие пики абсолютной погрешности лежат в области значений обоих множителей больше 200.
B
C
A*256
B*C
Погрешность
Относительная п
241
242
57856
58322
466
0.0079901
240
243
57856
58320
464
0.0079561
234
235
54528
54990
462
0.0084015
Не идеально, но более-менее. Относительная погрешность в этих пиках меньше процента.
Максимальные относительные погрешности - наоборот, на небольших значениях множителей.
B
C
A*256
B*C
Погрешность
Относительная п
31
1
256
31
-225
7.258
32
1
256
32
-224
7
45
1
256
45
-211
4.6889
Результат умножения не равномерный. 31*1=256, 32*1=256, а с 33 по 44 получаются нули.
Вот такие флуктуации и квантовые эффекты на низком уровне вселенной Элиты.