Hlavní navigace

Implementace aritmetických operací s FX formátem v Céčku

Pavel Tišnovský 19. 7. 2006

Dnes si ukážeme algoritmy realizované v programovacím jazyku C, ve kterých budou implementovány základní aritmetické operace s formátem pevné řádové binární čárky, včetně operací určených pro převod z FP formátu do formátu FX a zpětného převodu z FX formátu do formátu FP.

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 tak­to:

/*
 * 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í.

Našli jste v článku chybu?

20. 7. 2006 11:07

No, na PCcku se opravdu spousta veci resi hrubou silou. Pred cca rokem tady dokonce vysel nejaky clanek, ve kterem byl program, ktery zjistoval maximalni prvek v poli. Reseni bylo genialni: pole setridit a vratit posledni prvek :-)))

Ale existuje spousta aplikacnich oblasti, kde proste ta hruba sila neni k dispozici. Typickym prikladem jsou jednocipy (napriklad klony 8051, slavna 68HCxx, PICy apod.) a DSPcka. A zarizeni s temito procesory je radove vice, nez nejakych obludnych PCcek. [ale to vs…

19. 7. 2006 22:53

Ogar (neregistrovaný)
Kdysi sem sa (este pod DOSem) pekne vyradil - pomoci FX pointu 10.6 a s pomoci meho uzasneho SB AWE 32, sem si udelal realtime logicky analyzer - FFT pomoci motylka (vykresleni ve 320x200x256). Jo to byly casy, kdy clovek musel u programovani premyslet a optimalizovat - dneska se jde na vse hrubou silou :-(
Vitalia.cz: Pečete cukroví a zbyl vám bílek?

Pečete cukroví a zbyl vám bílek?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

DigiZone.cz: Flix TV má set-top box s HEVC

Flix TV má set-top box s HEVC

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu