?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