Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages   Examples  

math/round.cpp

Go to the documentation of this file.
00001 #include "round.h"
00002 
00007 #include <math/real.h>
00008 
00010 // round(const float value, const int precision)                            //                                                        //
00012 
00013 float round(const float value, const int precision)
00014 {
00015     return (float) round(double(value),precision);
00016 }
00017 
00019 // double round(constdouble value, const int precision)                     //
00021 
00022 double round(const double value, const int precision)
00023 {
00024     if (precision>=0) 
00025     {
00026         // Prevent excessive precision
00027 
00028         const int p = CLAMP(precision,-15,15);
00029         
00030         // Lookup table for pwr(10.0,i)
00031 
00032         const static double pwr[] = { 
00033                 1e0,  1e1,  1e2,  1e3,  1e4, 
00034                 1e5,  1e6,  1e7,  1e8,  1e9, 
00035                 1e10, 1e11, 1e12, 1e13, 1e14 };
00036 
00037         // Table of inverses
00038         const static double invpwr[] = {
00039                 1e0,   1e-1,  1e-2,  1e-3,  1e-4, 
00040                 1e-5,  1e-6,  1e-7,  1e-8,  1e-9, 
00041                 1e-10, 1e-11, 1e-12, 1e-13, 1e-14 };
00042 
00043         //
00044 
00045         double val = value;
00046 
00047         // 
00048 
00049         if (value<0.0)
00050             val = ceil(val*pwr[p]-0.5);
00051 
00052         if (value>0.0)
00053             val = floor(val*pwr[p]+0.5);
00054 
00055         return val*invpwr[p];
00056     }
00057     
00058     // TODO - Precision is negative
00059 
00060     return value;
00061 }
00062 

Generated on Tue Nov 5 11:11:04 2002 for GLT by doxygen1.2.18