Obsah
1. Převod hodnot z FP formátu do FX formátu
2. Převod celočíselných hodnot do FX formátu
3. Zpětný převod z FX formátu do FP formátu
4. Tisk numerické hodnoty uložené v FX formátu
5. Aritmetická operace součtu s dvojicí FX hodnot
6. Aritmetická operace rozdílu s dvojicí FX hodnot
7. Aritmetická operace násobení s dvojicí FX hodnot
8. Aritmetická operace dělení s dvojicí FX hodnot
9. Obsah dalšího pokračování tohoto seriálu
1. Převod hodnot z FP formátu do FX formátu
V dnešní části seriálu navážeme na část předchozí, ve které jsme si ozřejmili princip provádění základních operací s numerickými hodnotami uloženými ve formátu pevné řádové binární čárky. Začneme základní a v praxi často prováděnou operací – převodem hodnot původně uložených ve formátu pohyblivé řádové binární čárky (FP) do formátu pevné řádové binární čárky (FX). Tuto operaci je možné zapsat následovně:
XFX=XFP×2B
Operaci 2B je samozřejmě vhodnější převést na bitový posun, tj. například 2<<(B-1) či 1<<B. Při implementaci v programovacím jazyku C je vhodné ukládat hodnoty v FX formátu do proměnných odpovídajících svou velikostí základnímu datovému typu int, long či long long. Protože předpokládám použití 32bitových procesorů, musí být součet bitů před a za binární čárkou roven 32, nejčastěji se volí A=16 a B=16, tj. šestnáct bitů umístěných před binární řádovou čárkou (včetně znaménka) a šestnáct bitů umístěných za binární řádovou čárkou. Definice konstant A a B i datového typu fx může v Céčku vypadat následovně:
#define A 16
#define B 16
typedef signed int fx;
Vlastní funkci pro převod z formátu FP do formátu FX lze napsat například následujícím způsobem, který není závislý na konkrétní podobě dat zpracovávaných matematickým koprocesorem:
/*
* Převod z formátu plovoucí řádové binární čárky (FP)
* do formátu pevné řádové binární čárky (FX)
*/
fx fp2fx(double x)
{
return (fx)(x*(2<<(B-1)));
}
2. Převod celočíselných hodnot do FX formátu
Pro převod celočíselné hodnoty (integer) do formátu pevné řádové binární čárky se provede pouze bitový posun původní hodnoty o b bitů doleva, což je opět podporovaná operace (tentokrát však prováděná na CPU a nikoli na FPU):
XFX=XINT<<B
V programovacím jazyce C je funkce pro převod velmi jednoduchá a přímočará:
/*
* Převod z celočíselného formátu (integer)
* do formátu pevné řádové binární čárky (FX)
*/
fx int2fx(int x)
{
return (fx)(x<<B);
}
3. Zpětný převod z FX formátu do FP formátu
Zpětný převod numerické hodnoty z formátu pevné řádové čárky do formátu řádové čárky plovoucí, se v nejjednodušším případě provádí převrácením postupu uvedeného v předchozí kapitole, tj.:
XFP=XFX/2B
Praktická implementace se zjednoduší náhradou operace 2B bitovým posuvem, tj. 2<<(B-1) či 1<<B:
/*
* Převod z formátu pevné řádové binární čárky (FX)
* do formátu plovoucí řádové binární čárky (FP)
*/
double fx2fp(fx x)
{
return (double)x/(2<<(B-1));
}
4. Tisk numerické hodnoty uložené v FX formátu
Pro tisk numerické hodnoty uložené ve formátu pevné řádové binární čárky jsem zvolil poměrně „upovídanou“ variantu funkce, která po svém zavolání vytiskne binární obsah hodnoty i s umístěním binární čárky, dále pak hexadecimální hodnotu a posléze i reálnou hodnotu získanou pomocí výše uvedené funkce fx2fp():
/*
* Tisk numerické hodnoty uložené ve formátu pevné
* řádové binární čárky (FX)
*/
void fx_print(fx x)
{
int i;
int val=x; // pomocná proměnná pro převod do dvojkové soustavy
printf("bin: ");
for (i=0; i<A+B; i++) { // převod na řetězec bitů (do dvojkové soustavy)
putchar(!!(val & (1<<(A+B-1)))+'0'); // výpis hodnoty aktuálně nejvyššího bitu
if (i==B-1) putchar('.'); // po řádové binární čárce vypsat značku
val=val<<1; // posun na další (méně významný) bit
}
printf(" hex: %08x fp: %+11.5f\n", x, fx2fp(x));
}
Pomocí funkce fx_print() si můžeme otestovat korektnost převodů do formátu FX, například pomocí následujícího programového kódu:
int main(void)
{
// pole hodnot uložených ve formátu FP
double fp[]={ 1,
-1,
2,
-2,
0.5,
1.5,
3.0,
3.1415927,
-3.1415927,
2.718281,
-2.718281,
100,
-100,
0}; // zarážka
// pole hodnot uložených v celočíselném formátu
int integers[]={ 1,
2,
42,
100,
1000,
-1,
-2,
-42,
-100,
-1000,
0}; // zarážka
int i;
fx a;
puts("Reálná čísla:");
for (i=0; fp[i]!=0; i++) {
a=fp2fx(fp[i]);
fx_print(a);
}
puts("\nCeločíselné hodnoty:");
for (i=0; integers[i]!=0; i++) {
a=int2fx(integers[i]);
fx_print(a);
}
return 0;
}
Výsledek běhu předchozího programu:
Reálná čísla:
bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
bin: 0000000000000011.0010010000111111 hex: 0003243f fp: +3.14159
bin: 1111111111111100.1101101111000001 hex: fffcdbc1 fp: -3.14159
bin: 0000000000000010.1011011111100001 hex: 0002b7e1 fp: +2.71828
bin: 1111111111111101.0100100000011111 hex: fffd481f fp: -2.71828
bin: 0000000001100100.0000000000000000 hex: 00640000 fp: +100.00000
bin: 1111111110011100.0000000000000000 hex: ff9c0000 fp: -100.00000
Celočíselné hodnoty:
bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
bin: 0000000000101010.0000000000000000 hex: 002a0000 fp: +42.00000
bin: 0000000001100100.0000000000000000 hex: 00640000 fp: +100.00000
bin: 0000001111101000.0000000000000000 hex: 03e80000 fp: +1000.00000
bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
bin: 1111111111010110.0000000000000000 hex: ffd60000 fp: -42.00000
bin: 1111111110011100.0000000000000000 hex: ff9c0000 fp: -100.00000
bin: 1111110000011000.0000000000000000 hex: fc180000 fp: -1000.00000
5. Aritmetická operace součtu s dvojicí FX hodnot
Aritmetickou operaci součtu je možné provádět pouze v případě, že obě hodnoty mají stejný formát, tj. shodný počet bitů před a za binární řádovou čárkou. Pokud je tato podmínka splněna, je možné součet dvou numerických hodnot X a Y zapsat následovně:
X×2B+Y×2B=(X+Y)×2B
Implementace v Céčku je vskutku jednoduchá:
/*
* Součet dvou hodnot uložených ve shodném formátu
* pevné binární řádové čárky (FX)
*/
fx fx_add(fx x, fx y)
{
return x+y;
}
Testovací příklad využívající uvedenou funkci fx_add():
int main(void)
{
double fp[]={1, -1, 2, -2, 0.5, 1.5, 3.0, 3.1415927, -3.1415927, 2.718281, -2.718281, 0};
int i,j;
fx a, b;
puts("Součet dvojice čísel uložených ve formátu FX:");
for (j=0; fp[j]!=0; j++) {
for (i=0; fp[i]!=0; i++) {
a=fp2fx(fp[i]);
b=fp2fx(fp[j]);
printf("%+4.2f%+4.2f= ", fp[i], fp[j]);
fx_print(fx_add(a,b));
}
}
return 0;
}
Výsledek běhu testovacího příkladu (všimněte si některých nepřesných výpočtů způsobených malou bitovou délkou vektoru za binární čárkou):
Součet dvojice čísel uložených ve formátu FX:
+1.00+1.00= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-1.00+1.00= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+2.00+1.00= bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
-2.00+1.00= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+0.50+1.00= bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
+1.50+1.00= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
+3.00+1.00= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
+3.14+1.00= bin: 0000000000000100.0010010000111111 hex: 0004243f fp: +4.14159
-3.14+1.00= bin: 1111111111111101.1101101111000001 hex: fffddbc1 fp: -2.14159
+2.72+1.00= bin: 0000000000000011.1011011111100001 hex: 0003b7e1 fp: +3.71828
-2.72+1.00= bin: 1111111111111110.0100100000011111 hex: fffe481f fp: -1.71828
+1.00-1.00= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-1.00-1.00= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+2.00-1.00= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-2.00-1.00= bin: 1111111111111101.0000000000000000 hex: fffd0000 fp: -3.00000
+0.50-1.00= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+1.50-1.00= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+3.00-1.00= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+3.14-1.00= bin: 0000000000000010.0010010000111111 hex: 0002243f fp: +2.14159
-3.14-1.00= bin: 1111111111111011.1101101111000001 hex: fffbdbc1 fp: -4.14159
+2.72-1.00= bin: 0000000000000001.1011011111100001 hex: 0001b7e1 fp: +1.71828
-2.72-1.00= bin: 1111111111111100.0100100000011111 hex: fffc481f fp: -3.71828
+1.00+2.00= bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
-1.00+2.00= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+2.00+2.00= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
-2.00+2.00= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+0.50+2.00= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
+1.50+2.00= bin: 0000000000000011.1000000000000000 hex: 00038000 fp: +3.50000
+3.00+2.00= bin: 0000000000000101.0000000000000000 hex: 00050000 fp: +5.00000
+3.14+2.00= bin: 0000000000000101.0010010000111111 hex: 0005243f fp: +5.14159
-3.14+2.00= bin: 1111111111111110.1101101111000001 hex: fffedbc1 fp: -1.14159
+2.72+2.00= bin: 0000000000000100.1011011111100001 hex: 0004b7e1 fp: +4.71828
-2.72+2.00= bin: 1111111111111111.0100100000011111 hex: ffff481f fp: -0.71828
+1.00-2.00= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-1.00-2.00= bin: 1111111111111101.0000000000000000 hex: fffd0000 fp: -3.00000
+2.00-2.00= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-2.00-2.00= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
+0.50-2.00= bin: 1111111111111110.1000000000000000 hex: fffe8000 fp: -1.50000
+1.50-2.00= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+3.00-2.00= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+3.14-2.00= bin: 0000000000000001.0010010000111111 hex: 0001243f fp: +1.14159
-3.14-2.00= bin: 1111111111111010.1101101111000001 hex: fffadbc1 fp: -5.14159
+2.72-2.00= bin: 0000000000000000.1011011111100001 hex: 0000b7e1 fp: +0.71828
-2.72-2.00= bin: 1111111111111011.0100100000011111 hex: fffb481f fp: -4.71828
+1.00+0.50= bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
-1.00+0.50= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+2.00+0.50= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
-2.00+0.50= bin: 1111111111111110.1000000000000000 hex: fffe8000 fp: -1.50000
+0.50+0.50= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+1.50+0.50= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+3.00+0.50= bin: 0000000000000011.1000000000000000 hex: 00038000 fp: +3.50000
+3.14+0.50= bin: 0000000000000011.1010010000111111 hex: 0003a43f fp: +3.64159
-3.14+0.50= bin: 1111111111111101.0101101111000001 hex: fffd5bc1 fp: -2.64159
+2.72+0.50= bin: 0000000000000011.0011011111100001 hex: 000337e1 fp: +3.21828
-2.72+0.50= bin: 1111111111111101.1100100000011111 hex: fffdc81f fp: -2.21828
+1.00+1.50= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
-1.00+1.50= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+2.00+1.50= bin: 0000000000000011.1000000000000000 hex: 00038000 fp: +3.50000
-2.00+1.50= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+0.50+1.50= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+1.50+1.50= bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
+3.00+1.50= bin: 0000000000000100.1000000000000000 hex: 00048000 fp: +4.50000
+3.14+1.50= bin: 0000000000000100.1010010000111111 hex: 0004a43f fp: +4.64159
-3.14+1.50= bin: 1111111111111110.0101101111000001 hex: fffe5bc1 fp: -1.64159
+2.72+1.50= bin: 0000000000000100.0011011111100001 hex: 000437e1 fp: +4.21828
-2.72+1.50= bin: 1111111111111110.1100100000011111 hex: fffec81f fp: -1.21828
+1.00+3.00= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
-1.00+3.00= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+2.00+3.00= bin: 0000000000000101.0000000000000000 hex: 00050000 fp: +5.00000
-2.00+3.00= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+0.50+3.00= bin: 0000000000000011.1000000000000000 hex: 00038000 fp: +3.50000
+1.50+3.00= bin: 0000000000000100.1000000000000000 hex: 00048000 fp: +4.50000
+3.00+3.00= bin: 0000000000000110.0000000000000000 hex: 00060000 fp: +6.00000
+3.14+3.00= bin: 0000000000000110.0010010000111111 hex: 0006243f fp: +6.14159
-3.14+3.00= bin: 1111111111111111.1101101111000001 hex: ffffdbc1 fp: -0.14159
+2.72+3.00= bin: 0000000000000101.1011011111100001 hex: 0005b7e1 fp: +5.71828
-2.72+3.00= bin: 0000000000000000.0100100000011111 hex: 0000481f fp: +0.28172
+1.00+3.14= bin: 0000000000000100.0010010000111111 hex: 0004243f fp: +4.14159
-1.00+3.14= bin: 0000000000000010.0010010000111111 hex: 0002243f fp: +2.14159
+2.00+3.14= bin: 0000000000000101.0010010000111111 hex: 0005243f fp: +5.14159
-2.00+3.14= bin: 0000000000000001.0010010000111111 hex: 0001243f fp: +1.14159
+0.50+3.14= bin: 0000000000000011.1010010000111111 hex: 0003a43f fp: +3.64159
+1.50+3.14= bin: 0000000000000100.1010010000111111 hex: 0004a43f fp: +4.64159
+3.00+3.14= bin: 0000000000000110.0010010000111111 hex: 0006243f fp: +6.14159
+3.14+3.14= bin: 0000000000000110.0100100001111110 hex: 0006487e fp: +6.28317
-3.14+3.14= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+2.72+3.14= bin: 0000000000000101.1101110000100000 hex: 0005dc20 fp: +5.85986
-2.72+3.14= bin: 0000000000000000.0110110001011110 hex: 00006c5e fp: +0.42331
+1.00-3.14= bin: 1111111111111101.1101101111000001 hex: fffddbc1 fp: -2.14159
-1.00-3.14= bin: 1111111111111011.1101101111000001 hex: fffbdbc1 fp: -4.14159
+2.00-3.14= bin: 1111111111111110.1101101111000001 hex: fffedbc1 fp: -1.14159
-2.00-3.14= bin: 1111111111111010.1101101111000001 hex: fffadbc1 fp: -5.14159
+0.50-3.14= bin: 1111111111111101.0101101111000001 hex: fffd5bc1 fp: -2.64159
+1.50-3.14= bin: 1111111111111110.0101101111000001 hex: fffe5bc1 fp: -1.64159
+3.00-3.14= bin: 1111111111111111.1101101111000001 hex: ffffdbc1 fp: -0.14159
+3.14-3.14= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-3.14-3.14= bin: 1111111111111001.1011011110000010 hex: fff9b782 fp: -6.28317
+2.72-3.14= bin: 1111111111111111.1001001110100010 hex: ffff93a2 fp: -0.42331
-2.72-3.14= bin: 1111111111111010.0010001111100000 hex: fffa23e0 fp: -5.85986
+1.00+2.72= bin: 0000000000000011.1011011111100001 hex: 0003b7e1 fp: +3.71828
-1.00+2.72= bin: 0000000000000001.1011011111100001 hex: 0001b7e1 fp: +1.71828
+2.00+2.72= bin: 0000000000000100.1011011111100001 hex: 0004b7e1 fp: +4.71828
-2.00+2.72= bin: 0000000000000000.1011011111100001 hex: 0000b7e1 fp: +0.71828
+0.50+2.72= bin: 0000000000000011.0011011111100001 hex: 000337e1 fp: +3.21828
+1.50+2.72= bin: 0000000000000100.0011011111100001 hex: 000437e1 fp: +4.21828
+3.00+2.72= bin: 0000000000000101.1011011111100001 hex: 0005b7e1 fp: +5.71828
+3.14+2.72= bin: 0000000000000101.1101110000100000 hex: 0005dc20 fp: +5.85986
-3.14+2.72= bin: 1111111111111111.1001001110100010 hex: ffff93a2 fp: -0.42331
+2.72+2.72= bin: 0000000000000101.0110111111000010 hex: 00056fc2 fp: +5.43655
-2.72+2.72= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+1.00-2.72= bin: 1111111111111110.0100100000011111 hex: fffe481f fp: -1.71828
-1.00-2.72= bin: 1111111111111100.0100100000011111 hex: fffc481f fp: -3.71828
+2.00-2.72= bin: 1111111111111111.0100100000011111 hex: ffff481f fp: -0.71828
-2.00-2.72= bin: 1111111111111011.0100100000011111 hex: fffb481f fp: -4.71828
+0.50-2.72= bin: 1111111111111101.1100100000011111 hex: fffdc81f fp: -2.21828
+1.50-2.72= bin: 1111111111111110.1100100000011111 hex: fffec81f fp: -1.21828
+3.00-2.72= bin: 0000000000000000.0100100000011111 hex: 0000481f fp: +0.28172
+3.14-2.72= bin: 0000000000000000.0110110001011110 hex: 00006c5e fp: +0.42331
-3.14-2.72= bin: 1111111111111010.0010001111100000 hex: fffa23e0 fp: -5.85986
+2.72-2.72= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-2.72-2.72= bin: 1111111111111010.1001000000111110 hex: fffa903e fp: -5.43655
V praxi (zpracování signálů, počítačová grafika atd.) se někdy vyžaduje saturovaný součet, tj. takový součet, u kterého je zaručeno, že výsledná hodnota nepřeteče. Saturaci je možné zajistit buď příslušnou instrukcí mikroprocesoru, například pomocí instrukční sady MMX, nebo se napíše podmínka, jež zaručí, že se nebudou sčítat tak velká čísla, která by způsobila přetečení.
6. Aritmetická operace rozdílu s dvojicí FX hodnot
Aritmetická operace rozdílu se provádí naprosto stejným způsobem, jako aritmetická operace součtu. Pokud mají obě hodnoty vstupující do operace stejný počet bitů před a za binární řádovou čárkou, je splněna podmínka pro provedení operace rozdílu, kterou je možné zapsat následovně:
A×2B-B×2B=(A-B)×2B
I implementace rozdílu v Céčku je jednoduchá, podobně jako v případě operace součtu:
/*
* Rozdíl dvou hodnot uložených ve shodném formátu
* pevné binární řádové čárky (FX)
*/
fx fx_sub(fx x, fx y)
{
return x-y;
}
Testovací příklad, který provádí demonstraci funkce fx_sub(), má následující tvar:
int main(void)
{
double fp[]={1, -1, 2, -2, 0.5, 1.5, 3.0, 3.1415927, -3.1415927, 2.718281, -2.718281, 0};
int i,j;
fx a, b;
puts("Rozdíl dvojice čísel uložených ve formátu FX:");
for (j=0; fp[j]!=0; j++) {
for (i=0; fp[i]!=0; i++) {
a=fp2fx(fp[i]);
b=fp2fx(fp[j]);
printf("%+4.2f-(%+4.2f)= ", fp[i], fp[j]);
fx_print(fx_sub(a,b));
}
}
return 0;
}
Výsledek běhu demonstračního příkladu:
Rozdíl dvojice čísel uložených ve formátu FX:
+1.00-(+1.00)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-1.00-(+1.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+2.00-(+1.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-2.00-(+1.00)= bin: 1111111111111101.0000000000000000 hex: fffd0000 fp: -3.00000
+0.50-(+1.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+1.50-(+1.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+3.00-(+1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+3.14-(+1.00)= bin: 0000000000000010.0010010000111111 hex: 0002243f fp: +2.14159
-3.14-(+1.00)= bin: 1111111111111011.1101101111000001 hex: fffbdbc1 fp: -4.14159
+2.72-(+1.00)= bin: 0000000000000001.1011011111100001 hex: 0001b7e1 fp: +1.71828
-2.72-(+1.00)= bin: 1111111111111100.0100100000011111 hex: fffc481f fp: -3.71828
+1.00-(-1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-1.00-(-1.00)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+2.00-(-1.00)= bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
-2.00-(-1.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+0.50-(-1.00)= bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
+1.50-(-1.00)= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
+3.00-(-1.00)= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
+3.14-(-1.00)= bin: 0000000000000100.0010010000111111 hex: 0004243f fp: +4.14159
-3.14-(-1.00)= bin: 1111111111111101.1101101111000001 hex: fffddbc1 fp: -2.14159
+2.72-(-1.00)= bin: 0000000000000011.1011011111100001 hex: 0003b7e1 fp: +3.71828
-2.72-(-1.00)= bin: 1111111111111110.0100100000011111 hex: fffe481f fp: -1.71828
+1.00-(+2.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-1.00-(+2.00)= bin: 1111111111111101.0000000000000000 hex: fffd0000 fp: -3.00000
+2.00-(+2.00)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-2.00-(+2.00)= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
+0.50-(+2.00)= bin: 1111111111111110.1000000000000000 hex: fffe8000 fp: -1.50000
+1.50-(+2.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+3.00-(+2.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+3.14-(+2.00)= bin: 0000000000000001.0010010000111111 hex: 0001243f fp: +1.14159
-3.14-(+2.00)= bin: 1111111111111010.1101101111000001 hex: fffadbc1 fp: -5.14159
+2.72-(+2.00)= bin: 0000000000000000.1011011111100001 hex: 0000b7e1 fp: +0.71828
-2.72-(+2.00)= bin: 1111111111111011.0100100000011111 hex: fffb481f fp: -4.71828
+1.00-(-2.00)= bin: 0000000000000011.0000000000000000 hex: 00030000 fp: +3.00000
-1.00-(-2.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+2.00-(-2.00)= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
-2.00-(-2.00)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+0.50-(-2.00)= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
+1.50-(-2.00)= bin: 0000000000000011.1000000000000000 hex: 00038000 fp: +3.50000
+3.00-(-2.00)= bin: 0000000000000101.0000000000000000 hex: 00050000 fp: +5.00000
+3.14-(-2.00)= bin: 0000000000000101.0010010000111111 hex: 0005243f fp: +5.14159
-3.14-(-2.00)= bin: 1111111111111110.1101101111000001 hex: fffedbc1 fp: -1.14159
+2.72-(-2.00)= bin: 0000000000000100.1011011111100001 hex: 0004b7e1 fp: +4.71828
-2.72-(-2.00)= bin: 1111111111111111.0100100000011111 hex: ffff481f fp: -0.71828
+1.00-(+0.50)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
-1.00-(+0.50)= bin: 1111111111111110.1000000000000000 hex: fffe8000 fp: -1.50000
+2.00-(+0.50)= bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
-2.00-(+0.50)= bin: 1111111111111101.1000000000000000 hex: fffd8000 fp: -2.50000
+0.50-(+0.50)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+1.50-(+0.50)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+3.00-(+0.50)= bin: 0000000000000010.1000000000000000 hex: 00028000 fp: +2.50000
+3.14-(+0.50)= bin: 0000000000000010.1010010000111111 hex: 0002a43f fp: +2.64159
-3.14-(+0.50)= bin: 1111111111111100.0101101111000001 hex: fffc5bc1 fp: -3.64159
+2.72-(+0.50)= bin: 0000000000000010.0011011111100001 hex: 000237e1 fp: +2.21828
-2.72-(+0.50)= bin: 1111111111111100.1100100000011111 hex: fffcc81f fp: -3.21828
+1.00-(+1.50)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
-1.00-(+1.50)= bin: 1111111111111101.1000000000000000 hex: fffd8000 fp: -2.50000
+2.00-(+1.50)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
-2.00-(+1.50)= bin: 1111111111111100.1000000000000000 hex: fffc8000 fp: -3.50000
+0.50-(+1.50)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+1.50-(+1.50)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+3.00-(+1.50)= bin: 0000000000000001.1000000000000000 hex: 00018000 fp: +1.50000
+3.14-(+1.50)= bin: 0000000000000001.1010010000111111 hex: 0001a43f fp: +1.64159
-3.14-(+1.50)= bin: 1111111111111011.0101101111000001 hex: fffb5bc1 fp: -4.64159
+2.72-(+1.50)= bin: 0000000000000001.0011011111100001 hex: 000137e1 fp: +1.21828
-2.72-(+1.50)= bin: 1111111111111011.1100100000011111 hex: fffbc81f fp: -4.21828
+1.00-(+3.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
-1.00-(+3.00)= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
+2.00-(+3.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-2.00-(+3.00)= bin: 1111111111111011.0000000000000000 hex: fffb0000 fp: -5.00000
+0.50-(+3.00)= bin: 1111111111111101.1000000000000000 hex: fffd8000 fp: -2.50000
+1.50-(+3.00)= bin: 1111111111111110.1000000000000000 hex: fffe8000 fp: -1.50000
+3.00-(+3.00)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+3.14-(+3.00)= bin: 0000000000000000.0010010000111111 hex: 0000243f fp: +0.14159
-3.14-(+3.00)= bin: 1111111111111001.1101101111000001 hex: fff9dbc1 fp: -6.14159
+2.72-(+3.00)= bin: 1111111111111111.1011011111100001 hex: ffffb7e1 fp: -0.28172
-2.72-(+3.00)= bin: 1111111111111010.0100100000011111 hex: fffa481f fp: -5.71828
+1.00-(+3.14)= bin: 1111111111111101.1101101111000001 hex: fffddbc1 fp: -2.14159
-1.00-(+3.14)= bin: 1111111111111011.1101101111000001 hex: fffbdbc1 fp: -4.14159
+2.00-(+3.14)= bin: 1111111111111110.1101101111000001 hex: fffedbc1 fp: -1.14159
-2.00-(+3.14)= bin: 1111111111111010.1101101111000001 hex: fffadbc1 fp: -5.14159
+0.50-(+3.14)= bin: 1111111111111101.0101101111000001 hex: fffd5bc1 fp: -2.64159
+1.50-(+3.14)= bin: 1111111111111110.0101101111000001 hex: fffe5bc1 fp: -1.64159
+3.00-(+3.14)= bin: 1111111111111111.1101101111000001 hex: ffffdbc1 fp: -0.14159
+3.14-(+3.14)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-3.14-(+3.14)= bin: 1111111111111001.1011011110000010 hex: fff9b782 fp: -6.28317
+2.72-(+3.14)= bin: 1111111111111111.1001001110100010 hex: ffff93a2 fp: -0.42331
-2.72-(+3.14)= bin: 1111111111111010.0010001111100000 hex: fffa23e0 fp: -5.85986
+1.00-(-3.14)= bin: 0000000000000100.0010010000111111 hex: 0004243f fp: +4.14159
-1.00-(-3.14)= bin: 0000000000000010.0010010000111111 hex: 0002243f fp: +2.14159
+2.00-(-3.14)= bin: 0000000000000101.0010010000111111 hex: 0005243f fp: +5.14159
-2.00-(-3.14)= bin: 0000000000000001.0010010000111111 hex: 0001243f fp: +1.14159
+0.50-(-3.14)= bin: 0000000000000011.1010010000111111 hex: 0003a43f fp: +3.64159
+1.50-(-3.14)= bin: 0000000000000100.1010010000111111 hex: 0004a43f fp: +4.64159
+3.00-(-3.14)= bin: 0000000000000110.0010010000111111 hex: 0006243f fp: +6.14159
+3.14-(-3.14)= bin: 0000000000000110.0100100001111110 hex: 0006487e fp: +6.28317
-3.14-(-3.14)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
+2.72-(-3.14)= bin: 0000000000000101.1101110000100000 hex: 0005dc20 fp: +5.85986
-2.72-(-3.14)= bin: 0000000000000000.0110110001011110 hex: 00006c5e fp: +0.42331
+1.00-(+2.72)= bin: 1111111111111110.0100100000011111 hex: fffe481f fp: -1.71828
-1.00-(+2.72)= bin: 1111111111111100.0100100000011111 hex: fffc481f fp: -3.71828
+2.00-(+2.72)= bin: 1111111111111111.0100100000011111 hex: ffff481f fp: -0.71828
-2.00-(+2.72)= bin: 1111111111111011.0100100000011111 hex: fffb481f fp: -4.71828
+0.50-(+2.72)= bin: 1111111111111101.1100100000011111 hex: fffdc81f fp: -2.21828
+1.50-(+2.72)= bin: 1111111111111110.1100100000011111 hex: fffec81f fp: -1.21828
+3.00-(+2.72)= bin: 0000000000000000.0100100000011111 hex: 0000481f fp: +0.28172
+3.14-(+2.72)= bin: 0000000000000000.0110110001011110 hex: 00006c5e fp: +0.42331
-3.14-(+2.72)= bin: 1111111111111010.0010001111100000 hex: fffa23e0 fp: -5.85986
+2.72-(+2.72)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
-2.72-(+2.72)= bin: 1111111111111010.1001000000111110 hex: fffa903e fp: -5.43655
+1.00-(-2.72)= bin: 0000000000000011.1011011111100001 hex: 0003b7e1 fp: +3.71828
-1.00-(-2.72)= bin: 0000000000000001.1011011111100001 hex: 0001b7e1 fp: +1.71828
+2.00-(-2.72)= bin: 0000000000000100.1011011111100001 hex: 0004b7e1 fp: +4.71828
-2.00-(-2.72)= bin: 0000000000000000.1011011111100001 hex: 0000b7e1 fp: +0.71828
+0.50-(-2.72)= bin: 0000000000000011.0011011111100001 hex: 000337e1 fp: +3.21828
+1.50-(-2.72)= bin: 0000000000000100.0011011111100001 hex: 000437e1 fp: +4.21828
+3.00-(-2.72)= bin: 0000000000000101.1011011111100001 hex: 0005b7e1 fp: +5.71828
+3.14-(-2.72)= bin: 0000000000000101.1101110000100000 hex: 0005dc20 fp: +5.85986
-3.14-(-2.72)= bin: 1111111111111111.1001001110100010 hex: ffff93a2 fp: -0.42331
+2.72-(-2.72)= bin: 0000000000000101.0110111111000010 hex: 00056fc2 fp: +5.43655
-2.72-(-2.72)= bin: 0000000000000000.0000000000000000 hex: 00000000 fp: +0.00000
7. Aritmetická operace násobení s dvojicí FX hodnot
Zde uvedená implementace aritmetické operace součinu předpokládá, že není k dispozici instrukce mikroprocesoru, která by dokázala vynásobit dvě 32bitová čísla a vrátit 64bitový výsledek. Z tohoto důvodu se před násobením obě hodnoty posunou o B/2 bitů doprava, čímž se sice ztratí přesnost, na druhou stranu se však zajistí, že pro mnoho hodnot nenastane přetečení. Násobení je možné v tomto případě implementovat takto:
/*
* Součin dvou hodnot uložených ve formátu
* pevné binární řádové čárky (FX)
*/
fx fx_mul(fx x, fx y)
{
fx result=(x>>(B/2))*(y>>(B/2));
return result;
}
Pokud by byla k dispozici operace násobení vracející výsledek na 64 bitů, provedlo by se nejdříve vynásobení a teprve poté bitový posun, tentokrát však o celých B bitů. Testovací příklad:
int main(void)
{
double fp[]={1, -1, 2, -2, 0.5, 3.1415927, -3.1415927, 0};
int i,j;
fx a, b;
puts("Součin dvojice čísel uložených ve formátu FX:");
for (j=0; fp[j]!=0; j++) {
for (i=0; fp[i]!=0; i++) {
a=fp2fx(fp[i]);
b=fp2fx(fp[j]);
printf("%+4.2f*(%+4.2f)= ", fp[i], fp[j]);
fx_print(fx_mul(a,b));
}
}
return 0;
}
Výsledek běhu testovacího příkladu:
Součin dvojice čísel uložených ve formátu FX:
+1.00*(+1.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-1.00*(+1.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+2.00*(+1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-2.00*(+1.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+0.50*(+1.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+3.14*(+1.00)= bin: 0000000000000011.0010010000000000 hex: 00032400 fp: +3.14063
-3.14*(+1.00)= bin: 1111111111111100.1101101100000000 hex: fffcdb00 fp: -3.14453
+1.00*(-1.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-1.00*(-1.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+2.00*(-1.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
-2.00*(-1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+0.50*(-1.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+3.14*(-1.00)= bin: 1111111111111100.1101110000000000 hex: fffcdc00 fp: -3.14063
-3.14*(-1.00)= bin: 0000000000000011.0010010100000000 hex: 00032500 fp: +3.14453
+1.00*(+2.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-1.00*(+2.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+2.00*(+2.00)= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
-2.00*(+2.00)= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
+0.50*(+2.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+3.14*(+2.00)= bin: 0000000000000110.0100100000000000 hex: 00064800 fp: +6.28125
-3.14*(+2.00)= bin: 1111111111111001.1011011000000000 hex: fff9b600 fp: -6.28906
+1.00*(-2.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
-1.00*(-2.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+2.00*(-2.00)= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
-2.00*(-2.00)= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
+0.50*(-2.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+3.14*(-2.00)= bin: 1111111111111001.1011100000000000 hex: fff9b800 fp: -6.28125
-3.14*(-2.00)= bin: 0000000000000110.0100101000000000 hex: 00064a00 fp: +6.28906
+1.00*(+0.50)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
-1.00*(+0.50)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+2.00*(+0.50)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-2.00*(+0.50)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+0.50*(+0.50)= bin: 0000000000000000.0100000000000000 hex: 00004000 fp: +0.25000
+3.14*(+0.50)= bin: 0000000000000001.1001001000000000 hex: 00019200 fp: +1.57031
-3.14*(+0.50)= bin: 1111111111111110.0110110110000000 hex: fffe6d80 fp: -1.57227
+1.00*(+3.14)= bin: 0000000000000011.0010010000000000 hex: 00032400 fp: +3.14063
-1.00*(+3.14)= bin: 1111111111111100.1101110000000000 hex: fffcdc00 fp: -3.14063
+2.00*(+3.14)= bin: 0000000000000110.0100100000000000 hex: 00064800 fp: +6.28125
-2.00*(+3.14)= bin: 1111111111111001.1011100000000000 hex: fff9b800 fp: -6.28125
+0.50*(+3.14)= bin: 0000000000000001.1001001000000000 hex: 00019200 fp: +1.57031
+3.14*(+3.14)= bin: 0000000000001001.1101110100010000 hex: 0009dd10 fp: +9.86353
-3.14*(+3.14)= bin: 1111111111110110.0001111111001100 hex: fff61fcc fp: -9.87579
+1.00*(-3.14)= bin: 1111111111111100.1101101100000000 hex: fffcdb00 fp: -3.14453
-1.00*(-3.14)= bin: 0000000000000011.0010010100000000 hex: 00032500 fp: +3.14453
+2.00*(-3.14)= bin: 1111111111111001.1011011000000000 hex: fff9b600 fp: -6.28906
-2.00*(-3.14)= bin: 0000000000000110.0100101000000000 hex: 00064a00 fp: +6.28906
+0.50*(-3.14)= bin: 1111111111111110.0110110110000000 hex: fffe6d80 fp: -1.57227
+3.14*(-3.14)= bin: 1111111111110110.0001111111001100 hex: fff61fcc fp: -9.87579
-3.14*(-3.14)= bin: 0000000000001001.1110001101011001 hex: 0009e359 fp: +9.88808
8. Aritmetická operace dělení s dvojicí FX hodnot
O podílu platí téměř stejné údaje jako u operace násobku, tj. na některých architekturách mohou nastat problémy z důvodu malé bitové šířky děličky. V těchto případech se (opět) může provést úprava dělence a dělitele před vstupem do operace podílu. Buď se zabrání přetečení výsledku (dělení dělencem bitově posunutým doleva), nebo se naopak zvýší přesnost výsledku s tím rizikem, že může dojít k přetečení. V demonstrační funkci jsem zvolil způsob, při kterém se dělí dělencem posunutým doprava (to odpovídá děliteli posunutém doleva) a výsledek se naopak posouvá o B/2 bitů doleva, aby se dosáhlo správného umístění binární tečky.
/*
* Podíl dvou hodnot uložených ve shodném formátu
* pevné binární řádové čárky (FX)
*/
fx fx_div(fx x, fx y)
{
fx result=x/(y>>(B/2));
return result<<(B/2);
}
Testovací příklad:
int main(void)
{
double fp[]={1, -1, 2, -2, 0.5, 10.0, 20.0, 0};
int i,j;
fx a, b;
puts("Podíl dvojice čísel uložených ve formátu FX:");
for (j=0; fp[j]!=0; j++) {
for (i=0; fp[i]!=0; i++) {
a=fp2fx(fp[i]);
b=fp2fx(fp[j]);
printf("%+6.2f/(%+6.2f)= ", fp[i], fp[j]);
fx_print(fx_div(a,b));
}
}
return 0;
}
Výsledek běhu testovacího příkladu:
Podíl dvojice čísel uložených ve formátu FX:
+1.00/( +1.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-1.00/( +1.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+2.00/( +1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-2.00/( +1.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+0.50/( +1.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+10.00/( +1.00)= bin: 0000000000001010.0000000000000000 hex: 000a0000 fp: +10.00000
+20.00/( +1.00)= bin: 0000000000010100.0000000000000000 hex: 00140000 fp: +20.00000
+1.00/( -1.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-1.00/( -1.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+2.00/( -1.00)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
-2.00/( -1.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+0.50/( -1.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+10.00/( -1.00)= bin: 1111111111110110.0000000000000000 hex: fff60000 fp: -10.00000
+20.00/( -1.00)= bin: 1111111111101100.0000000000000000 hex: ffec0000 fp: -20.00000
+1.00/( +2.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
-1.00/( +2.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
+2.00/( +2.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
-2.00/( +2.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
+0.50/( +2.00)= bin: 0000000000000000.0100000000000000 hex: 00004000 fp: +0.25000
+10.00/( +2.00)= bin: 0000000000000101.0000000000000000 hex: 00050000 fp: +5.00000
+20.00/( +2.00)= bin: 0000000000001010.0000000000000000 hex: 000a0000 fp: +10.00000
+1.00/( -2.00)= bin: 1111111111111111.1000000000000000 hex: ffff8000 fp: -0.50000
-1.00/( -2.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+2.00/( -2.00)= bin: 1111111111111111.0000000000000000 hex: ffff0000 fp: -1.00000
-2.00/( -2.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+0.50/( -2.00)= bin: 1111111111111111.1100000000000000 hex: ffffc000 fp: -0.25000
+10.00/( -2.00)= bin: 1111111111111011.0000000000000000 hex: fffb0000 fp: -5.00000
+20.00/( -2.00)= bin: 1111111111110110.0000000000000000 hex: fff60000 fp: -10.00000
+1.00/( +0.50)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
-1.00/( +0.50)= bin: 1111111111111110.0000000000000000 hex: fffe0000 fp: -2.00000
+2.00/( +0.50)= bin: 0000000000000100.0000000000000000 hex: 00040000 fp: +4.00000
-2.00/( +0.50)= bin: 1111111111111100.0000000000000000 hex: fffc0000 fp: -4.00000
+0.50/( +0.50)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+10.00/( +0.50)= bin: 0000000000010100.0000000000000000 hex: 00140000 fp: +20.00000
+20.00/( +0.50)= bin: 0000000000101000.0000000000000000 hex: 00280000 fp: +40.00000
+1.00/(+10.00)= bin: 0000000000000000.0001100100000000 hex: 00001900 fp: +0.09766
-1.00/(+10.00)= bin: 1111111111111111.1110011100000000 hex: ffffe700 fp: -0.09766
+2.00/(+10.00)= bin: 0000000000000000.0011001100000000 hex: 00003300 fp: +0.19922
-2.00/(+10.00)= bin: 1111111111111111.1100110100000000 hex: ffffcd00 fp: -0.19922
+0.50/(+10.00)= bin: 0000000000000000.0000110000000000 hex: 00000c00 fp: +0.04688
+10.00/(+10.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
+20.00/(+10.00)= bin: 0000000000000010.0000000000000000 hex: 00020000 fp: +2.00000
+1.00/(+20.00)= bin: 0000000000000000.0000110000000000 hex: 00000c00 fp: +0.04688
-1.00/(+20.00)= bin: 1111111111111111.1111010000000000 hex: fffff400 fp: -0.04688
+2.00/(+20.00)= bin: 0000000000000000.0001100100000000 hex: 00001900 fp: +0.09766
-2.00/(+20.00)= bin: 1111111111111111.1110011100000000 hex: ffffe700 fp: -0.09766
+0.50/(+20.00)= bin: 0000000000000000.0000011000000000 hex: 00000600 fp: +0.02344
+10.00/(+20.00)= bin: 0000000000000000.1000000000000000 hex: 00008000 fp: +0.50000
+20.00/(+20.00)= bin: 0000000000000001.0000000000000000 hex: 00010000 fp: +1.00000
9. Obsah dalšího pokračování tohoto seriálu
V následujícím (předposledním) pokračování tohoto seriálu si uvedeme implementaci výpočtu některých funkcí v FX formátu s využitím algoritmu CORDIC a iteračních postupů. Bude se například jednat o výpočty goniometrických funkcí.