00001 #include "round.h"
00002
00007 #include <math/real.h>
00008
00010
00012
00013 float round(const float value, const int precision)
00014 {
00015 return (float) round(double(value),precision);
00016 }
00017
00019
00021
00022 double round(const double value, const int precision)
00023 {
00024 if (precision>=0)
00025 {
00026
00027
00028 const int p = CLAMP(precision,-15,15);
00029
00030
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
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
00059
00060 return value;
00061 }
00062