00001 /* -*- c++ -*- */ 00002 /* 00003 * Copyright 2003,2005 Free Software Foundation, Inc. 00004 * 00005 * This file is part of GNU Radio 00006 * 00007 * GNU Radio is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 3, or (at your option) 00010 * any later version. 00011 * 00012 * GNU Radio is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with GNU Radio; see the file COPYING. If not, write to 00019 * the Free Software Foundation, Inc., 51 Franklin Street, 00020 * Boston, MA 02110-1301, USA. 00021 */ 00022 00023 /* 00024 * mathematical odds and ends. 00025 */ 00026 00027 #ifndef _GR_MATH_H_ 00028 #define _GR_MATH_H_ 00029 00030 #include <gr_complex.h> 00031 00032 static inline bool 00033 gr_is_power_of_2(long x) 00034 { 00035 return x != 0 && (x & (x-1)) == 0; 00036 } 00037 00038 long gr_gcd (long m, long n); 00039 00040 // returns a non-zero value if value is "not-a-number" (NaN), and 0 otherwise 00041 int gr_isnan (double value); 00042 00043 // returns a non-zero value if the value of x has its sign bit set. 00044 // 00045 // This is not the same as `x < 0.0', because IEEE 754 floating point 00046 // allows zero to be signed. The comparison `-0.0 < 0.0' is false, but 00047 // `gr_signbit (-0.0)' will return a nonzero value. 00048 00049 int gr_signbit (double x); 00050 00067 float gr_fast_atan2f(float y, float x); 00068 00069 static inline float gr_fast_atan2f(gr_complex z) 00070 { 00071 return gr_fast_atan2f(z.imag(), z.real()); 00072 } 00073 00074 00075 /* This bounds x by +/- clip without a branch */ 00076 00077 static inline float gr_branchless_clip(float x, float clip) 00078 { 00079 float x1 = fabsf(x+clip); 00080 float x2 = fabsf(x-clip); 00081 x1 -= x2; 00082 return 0.5*x1; 00083 } 00084 00085 static inline float gr_clip(float x, float clip) 00086 { 00087 float y; 00088 if(x > clip) 00089 y = clip; 00090 else if(x < -clip) 00091 y = -clip; 00092 return y; 00093 } 00094 00095 #endif /* _GR_MATH_H_ */