Hodilo by se něco podobného volat in a MCU? Kdysi jsme dělali ve fixed point formátu, dokonce na to měla Motorola 68011 nějakou podporu při násobení a dělení. A samozřejmě většina věcí se musela předpočítávat do EPROM, tedy kromě tabulky násobení. Na to nezbylo místo (64 kB EPROM jestli se nepletu, plus nějaký kilobajt na BUFALLO).
Záleží, o jaký čip se jedná :-). Pokud je to osmibitový šváb s pár kB FLASH, tak to může být problém, protože (a teď tedy trošku hádám) SW implementace bfloat16 nebo half-float nebude o moc jednodušší, než klasická implementace float/single. Spíš by to chtělo něco jednoduššího, bez podpory denormalizovaných čísel, NaN a nekonečen - tím se ušetří spousta podmínek a speciálních případů.
https://github.com/DW0RKiN/Floating-point-Library-for-Z80
Softwarova implementace bfloatu (s prehozenou pozici znamenkoveho bitu), binary16 (half) a formatu Daniela A. Nagyho (seee eeee mmmm mmmm) pro procesor Z80. Bez te podpory denormalizovanych cisel, NaN, nekonecen a presne nuly. Takze ani NaN nemuze po zadne matematicke operaci nastat. Fce jen vraci carry pokud je vysledek mimo rozsah a nasledne vrati maximalni nebo minimalni pripustnou hodnotu. Jsou tam i nahledy pri pouziti jednotlivych formatu v raytracingu. Takze si lze udelat predstavu o presnosti a casove narocnosti (cca 100x rychlejsi jak raytracing v basicu ZX Spectra) i o velikosti kodu s pomocnymi tabulkami.
13. 2. 2020, 05:18 editováno autorem komentáře
Ještě se zeptám - potřebujete pouze výpočty nebo i zobrazení hodnot (na nějakém připojeném displeji). Ten kód pro zobrazení bývá velký. Pokud není potřeba, tak například pro M0 (ok, to není osmibit, ale cenově dostupný 32bit ARM) existuje https://www.quinapalus.com/qfplib.html
; (a-b)^2 = aa-2ab+bb
; (a+b)^2 = aa+2ab+bb
; (a+b)^2-(a-b)^2 = 4ab
; ((a+b)^2-(a-b)^2)/4 = a*b
; ((a+b)/2)^2-((a-b)/2)^2 = a*b // plati jen diky trikum s lichymi a sudymi cisly
; 1.aaaaaaaa * 1.bbbbbbbb = // kde 1. je neukladany jednickovy bit
; (1+a)*(1+b) =
; ((1+a+1+b)^2 - (1+a-1-b)^2)/4 =
; ((2+a+b)^2 - (a-b)^2)/4 =
; (4 + 4*(a+b) + (a+b)^2 - (a-b)^2)/4 =
; 1 + a + b + ((a+b)^2 - (a-b)^2)/4 =
; 1 + a + b + ((a+b)/2)^2 - ((a-b)/2)^2
Pokud mantisa bez neukladaneho bitu je 8 bitova tak tabulka pro nasobeni ma 256 sestnactibitovych hodnot.
13. 2. 2020, 04:42 editováno autorem komentáře