00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IMPALGEBRA_UTILITY_H
00009 #define IMPALGEBRA_UTILITY_H
00010
00011 #include <cmath>
00012 #include "algebra_config.h"
00013 #include <IMP/exception.h>
00014
00015 IMPALGEBRA_BEGIN_NAMESPACE
00016
00017
00018 inline bool xorT(bool x, bool y)
00019 {
00020 return (((x) && !(y)) || (!(x) && (y)));
00021 }
00022
00023
00024
00025
00026 template<typename T>
00027 int get_sign(const T& x)
00028 {
00029 if (x >= 0) return 1;
00030 return -1;
00031 }
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 template<typename T>
00046 int get_rounded(const T& x)
00047 {
00048 if (x > 0) {
00049 return (int)((x) + 0.5);
00050 } else {
00051 return (int)((x) - 0.5);
00052 }
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 template<typename T>
00071 T get_constrained(const T x, const T x0, const T xF)
00072 {
00073 if (x < x0) return x0;
00074 if (x > xF) return xF;
00075 return x;
00076 }
00077
00078
00079
00080 inline float get_next_larger_power_of_2(float x) {
00081 float p=1;
00082 while(p<x) {p*=2;}
00083 return p;
00084 }
00085
00086
00087 inline double get_next_larger_power_of_2(double x) {
00088 double p=1;
00089 while(p<x) {p*=2;}
00090 return p;
00091 }
00092
00093
00094
00095
00096
00097 inline bool get_are_almost_equal(const double a, const double b,
00098 const double epsilon)
00099 {
00100 return (std::abs(a-b) < epsilon);
00101 }
00102
00103 IMPALGEBRA_END_NAMESPACE
00104
00105 #endif