?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 3

?prevdifflink? - Blame - ?getfile?

// Alternativni matematicka knihovna vychazejici z puvodni knihovny MATH prekladace CCS
// ale naprogramovana tak, aby se zbytecne neplytvalo prostredky procesoru.
// Vyuziva stejne aproximacni postupy ale algoritmy jsou napsany tak, aby vysledekm
// byl efektivnejsi kod (zejmena s ohledem na spotrebu programove pameti, dosazena
// uspora je vice nez 50%).
//
// (c)miho 2002
//
// Historie:
//
// 0.0   Jen sada funkci exp a jejich pribuznych
//
//
// Funkce:
//
// float exp2(float x)     exponencialni funkce se zakladem 2
//
// float exp(float x)      exponencialni funkce se zakladem e
//
// float exp10(float x)    exponencialni funkce se zakladem 10
//
// float expdb(float x)    exponencialni funkce pro prepocet dB ( expdb(20)=10 )
//


// Definice potrebnych konstant
//
#define EXP_BASE2    0.6931471806         // ln(2)
#define EXP_BASE10   0.30103              // log(2)=ln(2)/ln(10)
#define EXP_BASEDB   (20*EXP_BASE10)      // 20*log(2)


// Koeficienty aproximacniho polynomu aproximace 2^^x
//
float const per[7] = { 1.0, 0.693147172, 0.240227138, 0.0554965651,
                           0.00965065093, 0.00127100575, 0.000207455774 };


////////////////////////////////////////////////////////////////////////////
//      float exp2(float x)
////////////////////////////////////////////////////////////////////////////
// Description : returns the value (2^x)
//
float exp2(float x)
{

   float r;                // navratova hodnota (mazivysledek)
   signed int n,i;         // pomocne promenne
   short int s;            // priznak znamenka

   #ifdef _ERRNO           // osetreni preteceni
   if(x > 128)
   {
      errno=ERANGE;
      return(0);
   }
   #endif

   n = (signed long)(x);   // rad vysledku
   s = 0;                  // priznak zaporneho znamenka

   if (bit_test(x,15))     // zjisti znamenko -> if (x < 0)
   {                       // korekce na zaporne znamenko
      s = 1;               // zapamatuj si ho
      n = -n;              // cela cast je nezaporna
      x = -x;              // zbytek je nezaporny
   }

   x = x - (float)n;       // zlomkova cast

   r=per[6];               // vypocet polynomu v cyklu
   i=6;                    // tento tvar cyklu vede na optimalni kod
   do                      // s instrukci DECFSZ
      r = r*x + per[i-1];
   while (--i);

   *(&r) += n;             // doplneni exponentu

   if (s)                  // korekce na zaporne znamenko
      r = 1.0/r;

   return(r);              // vysledek
}


////////////////////////////////////////////////////////////////////////////
//      float exp(float x)
////////////////////////////////////////////////////////////////////////////
// Description : returns the value (e^x)
//
float exp(float x)
{
   exp2(x/EXP_BASE2);      // prevod meritka na 2^^n
}


////////////////////////////////////////////////////////////////////////////
//      float exp10(float x)
////////////////////////////////////////////////////////////////////////////
// Description : returns the value (10^x)
//
float exp10(float x)
{
   exp2(x/EXP_BASE10);     // prevod meritka na 10^^x
}


////////////////////////////////////////////////////////////////////////////
//      float exp20(float x)
////////////////////////////////////////////////////////////////////////////
// Description : returns the value (10^x)
//
float expdb(float x)
{
   exp2(x/EXP_BASEDB);      // prevod meritka na decibely
}
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3