/******************************************************************* Les Fonctions Flottantes en C utilisable sur tous les UNIX. ***************************************************************** Ce fichier est en lecture seule hors du projet ALE de l'INRIA Il est maintenu par : ILOG S.A. 9 rue Royale, 75008 Paris, France ***************************************************************** $Header: llfloat.c,v 4.4 88/11/22 15:29:33 kuczynsk Exp $ *******************************************************************/ /* Les conditionnelles de compilation IBMRT : l'IBM RT SUN4 : les SUN 4 SUNOS40 : Les syste`mes UN*X SUN OS 4.0 */ #include <signal.h> #include <errno.h> #include <math.h> extern int errno; /* Les accus flottants simples pre'cisions, obligatoires pour forcer le compilateur C a traiter la simple pre'cision (les parame`tres flottants sont toujours traite's en double pre'cision!). Il sont de'clare's dans <systeme>/ll<systeme>.llm3. */ extern float accusingle1; extern float accusingle2; /********************/ /* Les Conversions */ /********************/ /* Conversions flottants <--> ascii */ extern char *gcvt(); /* Conversion double flottant -> ascii */ int cvftoa(number, buffer) double number; char *buffer; { char* depart; int point; point = 0; depart = gcvt(number, 12, buffer); while(*buffer != '\0') if(*buffer++ == '.') point = 1; if(point == 0){ *buffer++ = '.'; *buffer = '\0'; } return(buffer - depart); } /* Conversion simple flottant -> ascii */ int cvstoa( buffer) char *buffer; { char* depart; int point; point = 0; #ifdef IBMRT depart = buffer; sprintf(buffer,"%g",accusingle1); #else depart = gcvt(accusingle1, 7, buffer); #endif /* IBMRT */ while(*buffer != '\0') if(*buffer++ == '.') point = 1; if(point == 0){ *buffer++ = '.'; *buffer = '\0'; } return(buffer - depart); } extern double atof(); /* Conversion ascii -> double flottant */ double cvatof (buffer) char *buffer; { double foo; errno = 0; foo = atof(buffer); /* the sun4 and SunOS4.0 have IEEE routines which routine Inf. */ #ifndef SUN4 #ifndef SUNOS40 if (errno == ERANGE) kill (getpid(), SIGFPE); #endif SUNOS40 #endif SUN4 return(foo); } /* Conversion ascii -> simple flottant */ cvatos (buffer) char *buffer; { double foo; errno = 0; foo = atof(buffer); /* the sun4 and SunOS4.0 have IEEE routines which routine Inf. */ #ifndef SUN4 #ifndef SUNOS40 if (errno == ERANGE) kill (getpid(), SIGFPE); #endif #endif accusingle2=foo; #ifdef UNIGRAPH asm("fmov.s accusingle2,%fp0"); #endif UNIGRAPH } /* Conversions doubles flottants <--> fixnums */ double floatc (n) int n;{ return(n); } int fixc(f) double f;{ return(f); } /* Convertions simples flottants <--> fixnums */ sfloatc (n) int n; { accusingle2=n; } int sfixc() { return (accusingle1); } /* Conversions simples flottants <--> doubles flottants */ dtosc (f) double f; { accusingle2=f; } double stodc () { return (accusingle1); } /***********************************/ /* Arithmetique doubles flottants */ /* operations elementaires doubles */ /***********************************/ double fplus(f1, f2) double f1, f2; { return(f2 + f1); } double fdiff(f1, f2) double f1, f2; { return(f2 - f1); } double ftimes(f1, f2) double f1, f2; { return(f2 * f1); } double fquo(f1, f2) double f1, f2; { return(f2 / f1); } int cfbeq (f1, f2) double f1, f2; { return(f1 == f2); } int cfbne (f1, f2) double f1, f2; { return(f1 != f2); } int cfble (f1, f2) double f1, f2; { return(f1 <= f2); } int cfblt (f1, f2) double f1, f2; { return(f1 < f2); } int cfbge (f1, f2) double f1, f2; { return(f1 >= f2); } int cfbgt (f1, f2) double f1, f2; { return(f1 > f2); } /* Les fonctions circulaires et mathematiques doubles */ double fsin(f1) double f1; { return(sin(f1)); } double fcos(f1) double f1; { return(cos(f1)); } double fasin(f1) double f1; { return(asin(f1)); } double facos(f1) double f1; { return(acos(f1)); } double fatan(f1) double f1; { return(atan(f1)); } double fexp(f1) double f1; { return(exp(f1)); } double flog(f1) double f1; { return(log(f1)); } double flog10(f1) double f1; { return(log10(f1)); } double fpower(f1,f2) double f1, f2; { return(pow(f1,f2)); } double fsqrt(f1) double f1; { return(sqrt(f1)); } /********************************************/ /* Arithmetique simples flottants */ /* operations elementaires simple precision */ /********************************************/ /* sens accu2 op acc1 -> accu2 */ splus() { accusingle2=accusingle2+accusingle1; } sdiff() { accusingle2=accusingle2-accusingle1; } stimes() { accusingle2=accusingle2*accusingle1; } squo() { accusingle2=accusingle2/accusingle1; } int csbeq () { return(accusingle1 == accusingle2); } int csbne () { return(accusingle1 != accusingle2); } int csble () { return(accusingle1 <= accusingle2); } int csblt () { return(accusingle1 < accusingle2); } int csbge () { return(accusingle1 >= accusingle2); } int csbgt () { return(accusingle1 > accusingle2); } /* Les fonctions circulaires et mathematiques simple presicion */ ssin() { accusingle2=sin(accusingle1); } scos() { accusingle2=cos(accusingle1); } sasin() { accusingle2=asin(accusingle1); } sacos() { accusingle2=acos(accusingle1); } satan() { accusingle2=atan(accusingle1); } sexp() { accusingle2=exp(accusingle1); } slog() { accusingle2=log(accusingle1); } slog10() { accusingle2=log10(accusingle1); } spower() { accusingle2=pow(accusingle1,accusingle2); } ssqrt() { accusingle2=sqrt(accusingle1); }