00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1993 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ UTI_MATH.C 00007 Nombre paquete............... UTI.H 00008 Lenguaje fuente.............. C (BC31,GCC) 00009 Estado....................... Utilizable 00010 Dependencia Hard/OS.......... - 00011 Codigo condicional........... - 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Comentario 00016 ------- -------- -------- ---------- 00017 1.0.0 01/07/97 Borja Codificacion inicial. 00018 00019 ======================== Contenido ======================== 00020 Funciones matematicas diversas 00021 =========================================================== 00022 */ 00023 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00024 /**********************************************************/ 00025 00026 #include <math.h> 00027 00028 #include "uti.h" 00029 00030 /**********************************************************/ 00031 /* redondea un valor double {n} al valor entero (double) 00032 mas proximo */ 00033 00034 double fround( double n ) 00035 { 00036 return ((n>=0.0) ? floor(n+0.5) : ceil(n-0.5)); 00037 } 00038 00039 /**********************************************************/ 00040 /* redondea un valor double {n} al valor entero (int) 00041 mas proximo */ 00042 00043 int float2int( double n ) 00044 { 00045 return ((n>=0.0) ? (int)(n+0.5) : (int)(n-0.5)); 00046 } 00047 00048 /**********************************************************/ 00049 /* redondea un valor double {n} al valor entero (long) 00050 mas proximo */ 00051 00052 long float2long( double n ) 00053 { 00054 return ((n>=0.0) ? (long)(n+0.5) : (long)(n-0.5)); 00055 } 00056 00057 /**********************************************************/ 00058 /* dados {y1} {y2} {y3} siendo {y2} mayor o igual que los 00059 otros dos valores, efectua una interpolacion cuadratica 00060 (parabola) entre los tres puntos y {devuelve} la 00061 posicion X normalizada del maximo (en el rango [-1,1], y tal 00062 que los valores -1,0,1 se corresponden respectivamente con 00063 los valores y1,y2,y3). Si en {y} se envia !=NULL, se devuelve 00064 el valor del maximo referido a {y2} (max-y2, probablemente algo 00065 mayor que 0). */ 00066 00067 double cuadfit( double y1, double y2, double y3, double *y ) 00068 { 00069 double b1 = (y3-y1)*0.5; 00070 double b2 = (y3+y1)*0.5-y2; 00071 double x = ( b2 ? x = -0.5*b1/b2 : 0 ); 00072 if (y) *y = (b1+b2*x)*x; 00073 return x; 00074 } 00075 00076 /**********************************************************/ 00077 /* {devuelve} el valor "{x} modulo {y}" pero en el rango -y/2 00078 a y/2). */ 00079 00080 #ifdef REMAINDER 00081 double remainder( double x, double y ) 00082 { 00083 double r,y2; 00084 r = fmod(x,y); 00085 y = fabs(y); 00086 y2 = y/2; 00087 if (r>=y2) r -= y; 00088 else if (r<=-y2) r += y; 00089 return r; 00090 } 00091 #endif 00092 00093 /**********************************************************/ 00094 /*Interpola linealmente y {devuelve} y para el valor {x}: 00095 . {x1}----->{y1} 00096 . {x2}----->{y2} 00097 Entonces: 00098 . {x}----->y ? ==>> interpolacion lineal 00099 00100 Si {x1}=={x2} {devuelve} la media de {y1} e {y2} 00101 */ 00102 00103 double linterpol( double x, double x1, double x2, 00104 double y1, double y2 ) 00105 { 00106 if (x1==x2) return (y1+y2)*0.5; 00107 else return y1 + ((x-x1)/(x2-x1))*(y2-y1); 00108 } 00109 00110 /**********************************************************/