/* * High Precision Math Library Supplement for floating point routines */ #include #include #include "pdefs.h" #include "pcvt.h" #include "precision.h" extern precision palloc(); /* * double to precision */ precision dtop(f) register double f; { register digitPtr uPtr; register precision u; u = palloc(DOUBLESIZE); /* pretty big */ if (u == pUndef) return u; if (f < 0.0) { f = -f; u->sign = true; } else { u->sign = false; } uPtr = u->value; do { *uPtr++ = fmod(f, (double) BASE); f = floor(f / (double) BASE); } while (f != 0.0); u->size = (uPtr - u->value); return presult(u); } /* * precision to double (no overflow check) */ double ptod(u) precision u; { register digitPtr uPtr; register double f; (void) pparm(u); uPtr = u->value + u->size; f = 0.0; do { f = f * (double) BASE + (double) *--uPtr; } while (uPtr > u->value); if (u->sign) f = -f; pdestroy(u); return f; }