Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Wed Oct 17 22:25:31 2012 +0000
Revision:
1:cc2a9eb0bd55
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 1:cc2a9eb0bd55 1 /*
narshu 1:cc2a9eb0bd55 2 * Tiny Vector Matrix Library
narshu 1:cc2a9eb0bd55 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
narshu 1:cc2a9eb0bd55 4 *
narshu 1:cc2a9eb0bd55 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
narshu 1:cc2a9eb0bd55 6 *
narshu 1:cc2a9eb0bd55 7 * This library is free software; you can redistribute it and/or
narshu 1:cc2a9eb0bd55 8 * modify it under the terms of the GNU Lesser General Public
narshu 1:cc2a9eb0bd55 9 * License as published by the Free Software Foundation; either
narshu 1:cc2a9eb0bd55 10 * version 2.1 of the License, or (at your option) any later version.
narshu 1:cc2a9eb0bd55 11 *
narshu 1:cc2a9eb0bd55 12 * This library is distributed in the hope that it will be useful,
narshu 1:cc2a9eb0bd55 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
narshu 1:cc2a9eb0bd55 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
narshu 1:cc2a9eb0bd55 15 * Lesser General Public License for more details.
narshu 1:cc2a9eb0bd55 16 *
narshu 1:cc2a9eb0bd55 17 * You should have received a copy of the GNU Lesser General Public
narshu 1:cc2a9eb0bd55 18 * License along with this library; if not, write to the Free Software
narshu 1:cc2a9eb0bd55 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
narshu 1:cc2a9eb0bd55 20 *
narshu 1:cc2a9eb0bd55 21 * $Id: NumericTraits.h,v 1.16 2007-06-23 15:58:58 opetzold Exp $
narshu 1:cc2a9eb0bd55 22 */
narshu 1:cc2a9eb0bd55 23
narshu 1:cc2a9eb0bd55 24 #ifndef TVMET_NUMERIC_TRAITS_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_NUMERIC_TRAITS_H
narshu 1:cc2a9eb0bd55 26
narshu 1:cc2a9eb0bd55 27 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 28 # include <complex>
narshu 1:cc2a9eb0bd55 29 #endif
narshu 1:cc2a9eb0bd55 30 #include <cmath>
narshu 1:cc2a9eb0bd55 31 #include <limits>
narshu 1:cc2a9eb0bd55 32
narshu 1:cc2a9eb0bd55 33 #include <tvmet/CompileTimeError.h>
narshu 1:cc2a9eb0bd55 34
narshu 1:cc2a9eb0bd55 35
narshu 1:cc2a9eb0bd55 36 namespace tvmet {
narshu 1:cc2a9eb0bd55 37
narshu 1:cc2a9eb0bd55 38
narshu 1:cc2a9eb0bd55 39 /**
narshu 1:cc2a9eb0bd55 40 * \class NumericTraits NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 41 * \brief Traits for integral types for operations.
narshu 1:cc2a9eb0bd55 42 *
narshu 1:cc2a9eb0bd55 43 * For each type we have to specialize this traits.
narshu 1:cc2a9eb0bd55 44 *
narshu 1:cc2a9eb0bd55 45 * \note Keep in mind that the long types long long and long double doesn't
narshu 1:cc2a9eb0bd55 46 * have traits. This is due to the sum_type. We can't give a guarantee
narshu 1:cc2a9eb0bd55 47 * that there is a type of holding the sum. Therefore using this traits
narshu 1:cc2a9eb0bd55 48 * is only safe if you have long long resp. long double types by
narshu 1:cc2a9eb0bd55 49 * working on long ints and doubles. Otherwise you will get not expected
narshu 1:cc2a9eb0bd55 50 * result for some circumstances. Anyway, you can use big integer/float
narshu 1:cc2a9eb0bd55 51 * libraries and specialize the traits by your own.
narshu 1:cc2a9eb0bd55 52 *
narshu 1:cc2a9eb0bd55 53 * \todo The abs function of complex<non_float_type> can have an
narshu 1:cc2a9eb0bd55 54 * overrun due to numeric computation. Solve it (someone
narshu 1:cc2a9eb0bd55 55 * using value_type=long here?)
narshu 1:cc2a9eb0bd55 56 */
narshu 1:cc2a9eb0bd55 57 template<class T>
narshu 1:cc2a9eb0bd55 58 struct NumericTraits {
narshu 1:cc2a9eb0bd55 59 typedef T base_type;
narshu 1:cc2a9eb0bd55 60 typedef T value_type;
narshu 1:cc2a9eb0bd55 61 typedef value_type sum_type;
narshu 1:cc2a9eb0bd55 62 typedef value_type diff_type;
narshu 1:cc2a9eb0bd55 63 typedef value_type float_type;
narshu 1:cc2a9eb0bd55 64 typedef value_type signed_type;
narshu 1:cc2a9eb0bd55 65
narshu 1:cc2a9eb0bd55 66 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 67 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 68
narshu 1:cc2a9eb0bd55 69 static inline
narshu 1:cc2a9eb0bd55 70 base_type real(argument_type x);
narshu 1:cc2a9eb0bd55 71
narshu 1:cc2a9eb0bd55 72 static inline
narshu 1:cc2a9eb0bd55 73 base_type imag(argument_type x);
narshu 1:cc2a9eb0bd55 74
narshu 1:cc2a9eb0bd55 75 static inline
narshu 1:cc2a9eb0bd55 76 value_type conj(argument_type x);
narshu 1:cc2a9eb0bd55 77
narshu 1:cc2a9eb0bd55 78 static inline
narshu 1:cc2a9eb0bd55 79 base_type abs(argument_type x);
narshu 1:cc2a9eb0bd55 80
narshu 1:cc2a9eb0bd55 81 static inline
narshu 1:cc2a9eb0bd55 82 value_type sqrt(argument_type x);
narshu 1:cc2a9eb0bd55 83
narshu 1:cc2a9eb0bd55 84 static inline
narshu 1:cc2a9eb0bd55 85 base_type norm_1(argument_type x) {
narshu 1:cc2a9eb0bd55 86 return NumericTraits<base_type>::abs(traits_type::real(x))
narshu 1:cc2a9eb0bd55 87 + NumericTraits<base_type>::abs(traits_type::imag(x));
narshu 1:cc2a9eb0bd55 88 }
narshu 1:cc2a9eb0bd55 89
narshu 1:cc2a9eb0bd55 90 static inline
narshu 1:cc2a9eb0bd55 91 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 92
narshu 1:cc2a9eb0bd55 93 static inline
narshu 1:cc2a9eb0bd55 94 base_type norm_inf(argument_type x) {
narshu 1:cc2a9eb0bd55 95 return std::max(NumericTraits<base_type>::abs(traits_type::real(x)),
narshu 1:cc2a9eb0bd55 96 NumericTraits<base_type>::abs(traits_type::imag(x)));
narshu 1:cc2a9eb0bd55 97 }
narshu 1:cc2a9eb0bd55 98
narshu 1:cc2a9eb0bd55 99 static inline
narshu 1:cc2a9eb0bd55 100 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 101 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 102 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 103 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 104
narshu 1:cc2a9eb0bd55 105 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 106 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 107 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 108 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 109 }
narshu 1:cc2a9eb0bd55 110 };
narshu 1:cc2a9eb0bd55 111
narshu 1:cc2a9eb0bd55 112
narshu 1:cc2a9eb0bd55 113 /*
narshu 1:cc2a9eb0bd55 114 * numeric traits for standard types
narshu 1:cc2a9eb0bd55 115 */
narshu 1:cc2a9eb0bd55 116
narshu 1:cc2a9eb0bd55 117
narshu 1:cc2a9eb0bd55 118 /**
narshu 1:cc2a9eb0bd55 119 * \class NumericTraits<char> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 120 * \brief Traits specialized for char.
narshu 1:cc2a9eb0bd55 121 */
narshu 1:cc2a9eb0bd55 122 template<>
narshu 1:cc2a9eb0bd55 123 struct NumericTraits<char> {
narshu 1:cc2a9eb0bd55 124 typedef char value_type;
narshu 1:cc2a9eb0bd55 125 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 126 typedef long sum_type;
narshu 1:cc2a9eb0bd55 127 typedef int diff_type;
narshu 1:cc2a9eb0bd55 128 typedef float float_type;
narshu 1:cc2a9eb0bd55 129 typedef char signed_type;
narshu 1:cc2a9eb0bd55 130
narshu 1:cc2a9eb0bd55 131 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 132 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 133
narshu 1:cc2a9eb0bd55 134 static inline
narshu 1:cc2a9eb0bd55 135 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 136
narshu 1:cc2a9eb0bd55 137 static inline
narshu 1:cc2a9eb0bd55 138 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 139
narshu 1:cc2a9eb0bd55 140 static inline
narshu 1:cc2a9eb0bd55 141 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 142
narshu 1:cc2a9eb0bd55 143 static inline
narshu 1:cc2a9eb0bd55 144 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 145
narshu 1:cc2a9eb0bd55 146 static inline
narshu 1:cc2a9eb0bd55 147 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 148 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 149 }
narshu 1:cc2a9eb0bd55 150
narshu 1:cc2a9eb0bd55 151 static inline
narshu 1:cc2a9eb0bd55 152 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 153
narshu 1:cc2a9eb0bd55 154 static inline
narshu 1:cc2a9eb0bd55 155 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 156
narshu 1:cc2a9eb0bd55 157 static inline
narshu 1:cc2a9eb0bd55 158 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 159
narshu 1:cc2a9eb0bd55 160 static inline
narshu 1:cc2a9eb0bd55 161 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 162
narshu 1:cc2a9eb0bd55 163 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 164
narshu 1:cc2a9eb0bd55 165 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 166 enum {
narshu 1:cc2a9eb0bd55 167 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 168 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 169 };
narshu 1:cc2a9eb0bd55 170 };
narshu 1:cc2a9eb0bd55 171
narshu 1:cc2a9eb0bd55 172
narshu 1:cc2a9eb0bd55 173 /**
narshu 1:cc2a9eb0bd55 174 * \class NumericTraits<unsigned char> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 175 * \brief Traits specialized for unsigned char.
narshu 1:cc2a9eb0bd55 176 *
narshu 1:cc2a9eb0bd55 177 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 178 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 179 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 180 * this function is missing here.
narshu 1:cc2a9eb0bd55 181 */
narshu 1:cc2a9eb0bd55 182 template<>
narshu 1:cc2a9eb0bd55 183 struct NumericTraits<unsigned char> {
narshu 1:cc2a9eb0bd55 184 typedef unsigned char value_type;
narshu 1:cc2a9eb0bd55 185 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 186 typedef unsigned long sum_type;
narshu 1:cc2a9eb0bd55 187 typedef int diff_type;
narshu 1:cc2a9eb0bd55 188 typedef float float_type;
narshu 1:cc2a9eb0bd55 189 typedef int signed_type;
narshu 1:cc2a9eb0bd55 190
narshu 1:cc2a9eb0bd55 191 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 192 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 193
narshu 1:cc2a9eb0bd55 194 static inline
narshu 1:cc2a9eb0bd55 195 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 196
narshu 1:cc2a9eb0bd55 197 static inline
narshu 1:cc2a9eb0bd55 198 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 199
narshu 1:cc2a9eb0bd55 200 static inline
narshu 1:cc2a9eb0bd55 201 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 202
narshu 1:cc2a9eb0bd55 203 static inline
narshu 1:cc2a9eb0bd55 204 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 205 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 206 }
narshu 1:cc2a9eb0bd55 207
narshu 1:cc2a9eb0bd55 208 static inline
narshu 1:cc2a9eb0bd55 209 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 210
narshu 1:cc2a9eb0bd55 211 static inline
narshu 1:cc2a9eb0bd55 212 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 213
narshu 1:cc2a9eb0bd55 214 static inline
narshu 1:cc2a9eb0bd55 215 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 216
narshu 1:cc2a9eb0bd55 217 static inline
narshu 1:cc2a9eb0bd55 218 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 219
narshu 1:cc2a9eb0bd55 220 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 221
narshu 1:cc2a9eb0bd55 222 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 223 enum {
narshu 1:cc2a9eb0bd55 224 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 225 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 226 };
narshu 1:cc2a9eb0bd55 227 };
narshu 1:cc2a9eb0bd55 228
narshu 1:cc2a9eb0bd55 229
narshu 1:cc2a9eb0bd55 230 /**
narshu 1:cc2a9eb0bd55 231 * \class NumericTraits<short int> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 232 * \brief Traits specialized for short int.
narshu 1:cc2a9eb0bd55 233 */
narshu 1:cc2a9eb0bd55 234 template<>
narshu 1:cc2a9eb0bd55 235 struct NumericTraits<short int> {
narshu 1:cc2a9eb0bd55 236 typedef short int value_type;
narshu 1:cc2a9eb0bd55 237 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 238 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 239 typedef long long sum_type;
narshu 1:cc2a9eb0bd55 240 #else
narshu 1:cc2a9eb0bd55 241 typedef long sum_type;
narshu 1:cc2a9eb0bd55 242 #endif
narshu 1:cc2a9eb0bd55 243 typedef int diff_type;
narshu 1:cc2a9eb0bd55 244 typedef float float_type;
narshu 1:cc2a9eb0bd55 245 typedef short int signed_type;
narshu 1:cc2a9eb0bd55 246
narshu 1:cc2a9eb0bd55 247 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 248 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 249
narshu 1:cc2a9eb0bd55 250 static inline
narshu 1:cc2a9eb0bd55 251 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 252
narshu 1:cc2a9eb0bd55 253 static inline
narshu 1:cc2a9eb0bd55 254 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 255
narshu 1:cc2a9eb0bd55 256 static inline
narshu 1:cc2a9eb0bd55 257 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 258
narshu 1:cc2a9eb0bd55 259 static inline
narshu 1:cc2a9eb0bd55 260 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 261
narshu 1:cc2a9eb0bd55 262 static inline
narshu 1:cc2a9eb0bd55 263 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 264 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 265 }
narshu 1:cc2a9eb0bd55 266
narshu 1:cc2a9eb0bd55 267 static inline
narshu 1:cc2a9eb0bd55 268 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 269
narshu 1:cc2a9eb0bd55 270 static inline
narshu 1:cc2a9eb0bd55 271 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 272
narshu 1:cc2a9eb0bd55 273 static inline
narshu 1:cc2a9eb0bd55 274 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 275
narshu 1:cc2a9eb0bd55 276 static inline
narshu 1:cc2a9eb0bd55 277 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 278
narshu 1:cc2a9eb0bd55 279 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 280
narshu 1:cc2a9eb0bd55 281 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 282 enum {
narshu 1:cc2a9eb0bd55 283 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 284 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 285 };
narshu 1:cc2a9eb0bd55 286 };
narshu 1:cc2a9eb0bd55 287
narshu 1:cc2a9eb0bd55 288
narshu 1:cc2a9eb0bd55 289 /**
narshu 1:cc2a9eb0bd55 290 * \class NumericTraits<short unsigned int> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 291 * \brief Traits specialized for short unsigned int.
narshu 1:cc2a9eb0bd55 292 *
narshu 1:cc2a9eb0bd55 293 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 294 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 295 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 296 * this function is missing here.
narshu 1:cc2a9eb0bd55 297 */
narshu 1:cc2a9eb0bd55 298 template<>
narshu 1:cc2a9eb0bd55 299 struct NumericTraits<short unsigned int> {
narshu 1:cc2a9eb0bd55 300 typedef short unsigned int value_type;
narshu 1:cc2a9eb0bd55 301 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 302 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 303 typedef unsigned long long sum_type;
narshu 1:cc2a9eb0bd55 304 #else
narshu 1:cc2a9eb0bd55 305 typedef unsigned long sum_type;
narshu 1:cc2a9eb0bd55 306 #endif
narshu 1:cc2a9eb0bd55 307 typedef int diff_type;
narshu 1:cc2a9eb0bd55 308 typedef float float_type;
narshu 1:cc2a9eb0bd55 309 typedef int signed_type;
narshu 1:cc2a9eb0bd55 310
narshu 1:cc2a9eb0bd55 311 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 312 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 313
narshu 1:cc2a9eb0bd55 314 static inline
narshu 1:cc2a9eb0bd55 315 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 316
narshu 1:cc2a9eb0bd55 317 static inline
narshu 1:cc2a9eb0bd55 318 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 319
narshu 1:cc2a9eb0bd55 320 static inline
narshu 1:cc2a9eb0bd55 321 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 322
narshu 1:cc2a9eb0bd55 323 static inline
narshu 1:cc2a9eb0bd55 324 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 325 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 326 }
narshu 1:cc2a9eb0bd55 327
narshu 1:cc2a9eb0bd55 328 static inline
narshu 1:cc2a9eb0bd55 329 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 330
narshu 1:cc2a9eb0bd55 331 static inline
narshu 1:cc2a9eb0bd55 332 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 333
narshu 1:cc2a9eb0bd55 334 static inline
narshu 1:cc2a9eb0bd55 335 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 336
narshu 1:cc2a9eb0bd55 337 static inline
narshu 1:cc2a9eb0bd55 338 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 339
narshu 1:cc2a9eb0bd55 340 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 341
narshu 1:cc2a9eb0bd55 342 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 343 enum {
narshu 1:cc2a9eb0bd55 344 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 345 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 346 };
narshu 1:cc2a9eb0bd55 347 };
narshu 1:cc2a9eb0bd55 348
narshu 1:cc2a9eb0bd55 349
narshu 1:cc2a9eb0bd55 350 /**
narshu 1:cc2a9eb0bd55 351 * \class NumericTraits<int> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 352 * \brief Traits specialized for int.
narshu 1:cc2a9eb0bd55 353 */
narshu 1:cc2a9eb0bd55 354 template<>
narshu 1:cc2a9eb0bd55 355 struct NumericTraits<int> {
narshu 1:cc2a9eb0bd55 356 typedef int value_type;
narshu 1:cc2a9eb0bd55 357 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 358 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 359 typedef long long sum_type;
narshu 1:cc2a9eb0bd55 360 #else
narshu 1:cc2a9eb0bd55 361 typedef long sum_type;
narshu 1:cc2a9eb0bd55 362 #endif
narshu 1:cc2a9eb0bd55 363 typedef int diff_type;
narshu 1:cc2a9eb0bd55 364 typedef double float_type;
narshu 1:cc2a9eb0bd55 365 typedef int signed_type;
narshu 1:cc2a9eb0bd55 366
narshu 1:cc2a9eb0bd55 367 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 368 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 369
narshu 1:cc2a9eb0bd55 370 static inline
narshu 1:cc2a9eb0bd55 371 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 372
narshu 1:cc2a9eb0bd55 373 static inline
narshu 1:cc2a9eb0bd55 374 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 375
narshu 1:cc2a9eb0bd55 376 static inline
narshu 1:cc2a9eb0bd55 377 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 378
narshu 1:cc2a9eb0bd55 379 static inline
narshu 1:cc2a9eb0bd55 380 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 381
narshu 1:cc2a9eb0bd55 382 static inline
narshu 1:cc2a9eb0bd55 383 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 384 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 385 }
narshu 1:cc2a9eb0bd55 386
narshu 1:cc2a9eb0bd55 387 static inline
narshu 1:cc2a9eb0bd55 388 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 389
narshu 1:cc2a9eb0bd55 390 static inline
narshu 1:cc2a9eb0bd55 391 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 392
narshu 1:cc2a9eb0bd55 393 static inline
narshu 1:cc2a9eb0bd55 394 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 395
narshu 1:cc2a9eb0bd55 396 static inline
narshu 1:cc2a9eb0bd55 397 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 398
narshu 1:cc2a9eb0bd55 399 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 400
narshu 1:cc2a9eb0bd55 401 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 402 enum {
narshu 1:cc2a9eb0bd55 403 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 404 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 405 };
narshu 1:cc2a9eb0bd55 406 };
narshu 1:cc2a9eb0bd55 407
narshu 1:cc2a9eb0bd55 408
narshu 1:cc2a9eb0bd55 409 /**
narshu 1:cc2a9eb0bd55 410 * \class NumericTraits<unsigned int> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 411 * \brief Traits specialized for unsigned int.
narshu 1:cc2a9eb0bd55 412 *
narshu 1:cc2a9eb0bd55 413 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 414 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 415 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 416 * this function is missing here.
narshu 1:cc2a9eb0bd55 417 */
narshu 1:cc2a9eb0bd55 418 template<>
narshu 1:cc2a9eb0bd55 419 struct NumericTraits<unsigned int> {
narshu 1:cc2a9eb0bd55 420 typedef unsigned int value_type;
narshu 1:cc2a9eb0bd55 421 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 422 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 423 typedef unsigned long long sum_type;
narshu 1:cc2a9eb0bd55 424 #else
narshu 1:cc2a9eb0bd55 425 typedef unsigned long sum_type;
narshu 1:cc2a9eb0bd55 426 #endif
narshu 1:cc2a9eb0bd55 427 typedef int diff_type;
narshu 1:cc2a9eb0bd55 428 typedef double float_type;
narshu 1:cc2a9eb0bd55 429 typedef long signed_type;
narshu 1:cc2a9eb0bd55 430
narshu 1:cc2a9eb0bd55 431 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 432 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 433
narshu 1:cc2a9eb0bd55 434 static inline
narshu 1:cc2a9eb0bd55 435 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 436
narshu 1:cc2a9eb0bd55 437 static inline
narshu 1:cc2a9eb0bd55 438 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 439
narshu 1:cc2a9eb0bd55 440 static inline
narshu 1:cc2a9eb0bd55 441 base_type abs(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 442
narshu 1:cc2a9eb0bd55 443 static inline
narshu 1:cc2a9eb0bd55 444 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 445 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 446 }
narshu 1:cc2a9eb0bd55 447
narshu 1:cc2a9eb0bd55 448 static inline
narshu 1:cc2a9eb0bd55 449 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 450
narshu 1:cc2a9eb0bd55 451 static inline
narshu 1:cc2a9eb0bd55 452 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 453
narshu 1:cc2a9eb0bd55 454 static inline
narshu 1:cc2a9eb0bd55 455 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 456
narshu 1:cc2a9eb0bd55 457 static inline
narshu 1:cc2a9eb0bd55 458 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 459
narshu 1:cc2a9eb0bd55 460 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 461
narshu 1:cc2a9eb0bd55 462 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 463 enum {
narshu 1:cc2a9eb0bd55 464 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 465 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 466 };
narshu 1:cc2a9eb0bd55 467 };
narshu 1:cc2a9eb0bd55 468
narshu 1:cc2a9eb0bd55 469
narshu 1:cc2a9eb0bd55 470 /**
narshu 1:cc2a9eb0bd55 471 * \class NumericTraits<long> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 472 * \brief Traits specialized for long.
narshu 1:cc2a9eb0bd55 473 */
narshu 1:cc2a9eb0bd55 474 template<>
narshu 1:cc2a9eb0bd55 475 struct NumericTraits<long> {
narshu 1:cc2a9eb0bd55 476 typedef long value_type;
narshu 1:cc2a9eb0bd55 477 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 478 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 479 typedef long long sum_type;
narshu 1:cc2a9eb0bd55 480 #else
narshu 1:cc2a9eb0bd55 481 typedef long sum_type;
narshu 1:cc2a9eb0bd55 482 #endif
narshu 1:cc2a9eb0bd55 483 typedef long diff_type;
narshu 1:cc2a9eb0bd55 484 typedef double float_type;
narshu 1:cc2a9eb0bd55 485 typedef long signed_type;
narshu 1:cc2a9eb0bd55 486
narshu 1:cc2a9eb0bd55 487 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 488 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 489
narshu 1:cc2a9eb0bd55 490 static inline
narshu 1:cc2a9eb0bd55 491 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 492
narshu 1:cc2a9eb0bd55 493 static inline
narshu 1:cc2a9eb0bd55 494 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 495
narshu 1:cc2a9eb0bd55 496 static inline
narshu 1:cc2a9eb0bd55 497 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 498
narshu 1:cc2a9eb0bd55 499 static inline
narshu 1:cc2a9eb0bd55 500 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 501
narshu 1:cc2a9eb0bd55 502 static inline
narshu 1:cc2a9eb0bd55 503 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 504 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 505 }
narshu 1:cc2a9eb0bd55 506
narshu 1:cc2a9eb0bd55 507 static inline
narshu 1:cc2a9eb0bd55 508 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 509
narshu 1:cc2a9eb0bd55 510 static inline
narshu 1:cc2a9eb0bd55 511 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 512
narshu 1:cc2a9eb0bd55 513 static inline
narshu 1:cc2a9eb0bd55 514 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 515
narshu 1:cc2a9eb0bd55 516 static inline
narshu 1:cc2a9eb0bd55 517 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 518
narshu 1:cc2a9eb0bd55 519 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 520
narshu 1:cc2a9eb0bd55 521 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 522 enum {
narshu 1:cc2a9eb0bd55 523 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 524 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 525 };
narshu 1:cc2a9eb0bd55 526 };
narshu 1:cc2a9eb0bd55 527
narshu 1:cc2a9eb0bd55 528
narshu 1:cc2a9eb0bd55 529 /**
narshu 1:cc2a9eb0bd55 530 * \class NumericTraits<unsigned long> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 531 * \brief Traits specialized for unsigned long.
narshu 1:cc2a9eb0bd55 532 *
narshu 1:cc2a9eb0bd55 533 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 534 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 535 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 536 * this function is missing here.
narshu 1:cc2a9eb0bd55 537 */
narshu 1:cc2a9eb0bd55 538 template<>
narshu 1:cc2a9eb0bd55 539 struct NumericTraits<unsigned long> {
narshu 1:cc2a9eb0bd55 540 typedef unsigned long value_type;
narshu 1:cc2a9eb0bd55 541 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 542 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 543 typedef unsigned long long sum_type;
narshu 1:cc2a9eb0bd55 544 #else
narshu 1:cc2a9eb0bd55 545 typedef unsigned long sum_type;
narshu 1:cc2a9eb0bd55 546 #endif
narshu 1:cc2a9eb0bd55 547 typedef unsigned long diff_type;
narshu 1:cc2a9eb0bd55 548 typedef double float_type;
narshu 1:cc2a9eb0bd55 549 typedef long signed_type;
narshu 1:cc2a9eb0bd55 550
narshu 1:cc2a9eb0bd55 551 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 552 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 553
narshu 1:cc2a9eb0bd55 554 static inline
narshu 1:cc2a9eb0bd55 555 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 556
narshu 1:cc2a9eb0bd55 557 static inline
narshu 1:cc2a9eb0bd55 558 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 559
narshu 1:cc2a9eb0bd55 560 static inline
narshu 1:cc2a9eb0bd55 561 base_type abs(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 562
narshu 1:cc2a9eb0bd55 563 static inline
narshu 1:cc2a9eb0bd55 564 value_type sqrt(argument_type x) {
narshu 1:cc2a9eb0bd55 565 return static_cast<value_type>(std::sqrt(static_cast<float_type>(x)));
narshu 1:cc2a9eb0bd55 566 }
narshu 1:cc2a9eb0bd55 567
narshu 1:cc2a9eb0bd55 568 static inline
narshu 1:cc2a9eb0bd55 569 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 570
narshu 1:cc2a9eb0bd55 571 static inline
narshu 1:cc2a9eb0bd55 572 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 573
narshu 1:cc2a9eb0bd55 574 static inline
narshu 1:cc2a9eb0bd55 575 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 576
narshu 1:cc2a9eb0bd55 577 static inline
narshu 1:cc2a9eb0bd55 578 bool equals(argument_type lhs, argument_type rhs) { return lhs == rhs; }
narshu 1:cc2a9eb0bd55 579
narshu 1:cc2a9eb0bd55 580 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 581
narshu 1:cc2a9eb0bd55 582 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 583 enum {
narshu 1:cc2a9eb0bd55 584 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 585 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 586 };
narshu 1:cc2a9eb0bd55 587 };
narshu 1:cc2a9eb0bd55 588
narshu 1:cc2a9eb0bd55 589
narshu 1:cc2a9eb0bd55 590 /**
narshu 1:cc2a9eb0bd55 591 * \class NumericTraits<float> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 592 * \brief Traits specialized for float.
narshu 1:cc2a9eb0bd55 593 */
narshu 1:cc2a9eb0bd55 594 template<>
narshu 1:cc2a9eb0bd55 595 struct NumericTraits<float> {
narshu 1:cc2a9eb0bd55 596 typedef float value_type;
narshu 1:cc2a9eb0bd55 597 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 598 typedef double sum_type;
narshu 1:cc2a9eb0bd55 599 typedef float diff_type;
narshu 1:cc2a9eb0bd55 600 typedef float float_type;
narshu 1:cc2a9eb0bd55 601 typedef float signed_type;
narshu 1:cc2a9eb0bd55 602
narshu 1:cc2a9eb0bd55 603 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 604 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 605
narshu 1:cc2a9eb0bd55 606 static inline
narshu 1:cc2a9eb0bd55 607 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 608
narshu 1:cc2a9eb0bd55 609 static inline
narshu 1:cc2a9eb0bd55 610 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 611
narshu 1:cc2a9eb0bd55 612 static inline
narshu 1:cc2a9eb0bd55 613 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 614
narshu 1:cc2a9eb0bd55 615 static inline
narshu 1:cc2a9eb0bd55 616 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 617
narshu 1:cc2a9eb0bd55 618 static inline
narshu 1:cc2a9eb0bd55 619 value_type sqrt(argument_type x) { return std::sqrt(x); }
narshu 1:cc2a9eb0bd55 620
narshu 1:cc2a9eb0bd55 621 static inline
narshu 1:cc2a9eb0bd55 622 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 623
narshu 1:cc2a9eb0bd55 624 static inline
narshu 1:cc2a9eb0bd55 625 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 626
narshu 1:cc2a9eb0bd55 627 static inline
narshu 1:cc2a9eb0bd55 628 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 629
narshu 1:cc2a9eb0bd55 630 static inline
narshu 1:cc2a9eb0bd55 631 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 632 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 633 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 634 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 635
narshu 1:cc2a9eb0bd55 636 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 637 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 638 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 639 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 640 }
narshu 1:cc2a9eb0bd55 641
narshu 1:cc2a9eb0bd55 642 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 643
narshu 1:cc2a9eb0bd55 644 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 645 enum {
narshu 1:cc2a9eb0bd55 646 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 647 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 648 };
narshu 1:cc2a9eb0bd55 649 };
narshu 1:cc2a9eb0bd55 650
narshu 1:cc2a9eb0bd55 651
narshu 1:cc2a9eb0bd55 652 /**
narshu 1:cc2a9eb0bd55 653 * \class NumericTraits<double> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 654 * \brief Traits specialized for double.
narshu 1:cc2a9eb0bd55 655 */
narshu 1:cc2a9eb0bd55 656 template<>
narshu 1:cc2a9eb0bd55 657 struct NumericTraits<double> {
narshu 1:cc2a9eb0bd55 658 typedef double value_type;
narshu 1:cc2a9eb0bd55 659 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 660 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 661 typedef long double sum_type;
narshu 1:cc2a9eb0bd55 662 #else
narshu 1:cc2a9eb0bd55 663 typedef double sum_type;
narshu 1:cc2a9eb0bd55 664 #endif
narshu 1:cc2a9eb0bd55 665 typedef double diff_type;
narshu 1:cc2a9eb0bd55 666 typedef double float_type;
narshu 1:cc2a9eb0bd55 667 typedef double signed_type;
narshu 1:cc2a9eb0bd55 668
narshu 1:cc2a9eb0bd55 669 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 670 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 671
narshu 1:cc2a9eb0bd55 672 static inline
narshu 1:cc2a9eb0bd55 673 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 674
narshu 1:cc2a9eb0bd55 675 static inline
narshu 1:cc2a9eb0bd55 676 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 677
narshu 1:cc2a9eb0bd55 678 static inline
narshu 1:cc2a9eb0bd55 679 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 680
narshu 1:cc2a9eb0bd55 681 static inline
narshu 1:cc2a9eb0bd55 682 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 683
narshu 1:cc2a9eb0bd55 684 static inline
narshu 1:cc2a9eb0bd55 685 value_type sqrt(argument_type x) { return std::sqrt(x); }
narshu 1:cc2a9eb0bd55 686
narshu 1:cc2a9eb0bd55 687 static inline
narshu 1:cc2a9eb0bd55 688 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 689
narshu 1:cc2a9eb0bd55 690 static inline
narshu 1:cc2a9eb0bd55 691 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 692
narshu 1:cc2a9eb0bd55 693 static inline
narshu 1:cc2a9eb0bd55 694 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 695
narshu 1:cc2a9eb0bd55 696 static inline
narshu 1:cc2a9eb0bd55 697 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 698 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 699 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 700 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 701
narshu 1:cc2a9eb0bd55 702 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 703 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 704 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 705 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 706 }
narshu 1:cc2a9eb0bd55 707
narshu 1:cc2a9eb0bd55 708 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 709
narshu 1:cc2a9eb0bd55 710 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 711 enum {
narshu 1:cc2a9eb0bd55 712 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 713 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 714 };
narshu 1:cc2a9eb0bd55 715 };
narshu 1:cc2a9eb0bd55 716
narshu 1:cc2a9eb0bd55 717
narshu 1:cc2a9eb0bd55 718 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 719 /**
narshu 1:cc2a9eb0bd55 720 * \class NumericTraits<long double> NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 721 * \brief Traits specialized for long double.
narshu 1:cc2a9eb0bd55 722 */
narshu 1:cc2a9eb0bd55 723 template<>
narshu 1:cc2a9eb0bd55 724 struct NumericTraits<long double> {
narshu 1:cc2a9eb0bd55 725 typedef long double value_type;
narshu 1:cc2a9eb0bd55 726 typedef value_type base_type;
narshu 1:cc2a9eb0bd55 727 typedef long double sum_type;
narshu 1:cc2a9eb0bd55 728 typedef long double diff_type;
narshu 1:cc2a9eb0bd55 729 typedef long double float_type;
narshu 1:cc2a9eb0bd55 730 typedef long double signed_type;
narshu 1:cc2a9eb0bd55 731
narshu 1:cc2a9eb0bd55 732 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 733 typedef value_type argument_type;
narshu 1:cc2a9eb0bd55 734
narshu 1:cc2a9eb0bd55 735 static inline
narshu 1:cc2a9eb0bd55 736 base_type real(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 737
narshu 1:cc2a9eb0bd55 738 static inline
narshu 1:cc2a9eb0bd55 739 base_type imag(argument_type) { return 0; }
narshu 1:cc2a9eb0bd55 740
narshu 1:cc2a9eb0bd55 741 static inline
narshu 1:cc2a9eb0bd55 742 value_type conj(argument_type x) { return x; }
narshu 1:cc2a9eb0bd55 743
narshu 1:cc2a9eb0bd55 744 static inline
narshu 1:cc2a9eb0bd55 745 base_type abs(argument_type x) { return std::abs(x); }
narshu 1:cc2a9eb0bd55 746
narshu 1:cc2a9eb0bd55 747 static inline
narshu 1:cc2a9eb0bd55 748 value_type sqrt(argument_type x) { return std::sqrt(x); }
narshu 1:cc2a9eb0bd55 749
narshu 1:cc2a9eb0bd55 750 static inline
narshu 1:cc2a9eb0bd55 751 base_type norm_1(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 752
narshu 1:cc2a9eb0bd55 753 static inline
narshu 1:cc2a9eb0bd55 754 base_type norm_2(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 755
narshu 1:cc2a9eb0bd55 756 static inline
narshu 1:cc2a9eb0bd55 757 base_type norm_inf(argument_type x) { return traits_type::abs(x); }
narshu 1:cc2a9eb0bd55 758
narshu 1:cc2a9eb0bd55 759 static inline
narshu 1:cc2a9eb0bd55 760 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 761 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 762 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 763 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 764
narshu 1:cc2a9eb0bd55 765 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 766 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 767 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 768 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 769 }
narshu 1:cc2a9eb0bd55 770
narshu 1:cc2a9eb0bd55 771 enum { is_complex = false };
narshu 1:cc2a9eb0bd55 772
narshu 1:cc2a9eb0bd55 773 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 774 enum {
narshu 1:cc2a9eb0bd55 775 ops_plus = 1, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 776 ops_muls = 1 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 777 };
narshu 1:cc2a9eb0bd55 778 };
narshu 1:cc2a9eb0bd55 779 #endif // TVMET_HAVE_LONG_DOUBLE
narshu 1:cc2a9eb0bd55 780
narshu 1:cc2a9eb0bd55 781
narshu 1:cc2a9eb0bd55 782 /*
narshu 1:cc2a9eb0bd55 783 * numeric traits for complex types
narshu 1:cc2a9eb0bd55 784 */
narshu 1:cc2a9eb0bd55 785 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 786
narshu 1:cc2a9eb0bd55 787 /**
narshu 1:cc2a9eb0bd55 788 * \class NumericTraits< std::complex<int> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 789 * \brief Traits specialized for std::complex<int>.
narshu 1:cc2a9eb0bd55 790 */
narshu 1:cc2a9eb0bd55 791 template<>
narshu 1:cc2a9eb0bd55 792 struct NumericTraits< std::complex<int> > {
narshu 1:cc2a9eb0bd55 793 typedef int base_type;
narshu 1:cc2a9eb0bd55 794 typedef std::complex<int> value_type;
narshu 1:cc2a9eb0bd55 795 typedef std::complex<long> sum_type;
narshu 1:cc2a9eb0bd55 796 typedef std::complex<int> diff_type;
narshu 1:cc2a9eb0bd55 797 typedef std::complex<float> float_type;
narshu 1:cc2a9eb0bd55 798 typedef std::complex<int> signed_type;
narshu 1:cc2a9eb0bd55 799
narshu 1:cc2a9eb0bd55 800 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 801 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 802
narshu 1:cc2a9eb0bd55 803 static inline
narshu 1:cc2a9eb0bd55 804 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 805
narshu 1:cc2a9eb0bd55 806 static inline
narshu 1:cc2a9eb0bd55 807 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 808
narshu 1:cc2a9eb0bd55 809 static inline
narshu 1:cc2a9eb0bd55 810 value_type conj(argument_type z) { return std::conj(z); }
narshu 1:cc2a9eb0bd55 811
narshu 1:cc2a9eb0bd55 812 static inline
narshu 1:cc2a9eb0bd55 813 base_type abs(argument_type z) {
narshu 1:cc2a9eb0bd55 814 base_type x = z.real();
narshu 1:cc2a9eb0bd55 815 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 816
narshu 1:cc2a9eb0bd55 817 // XXX probably case of overrun; header complex uses scaling
narshu 1:cc2a9eb0bd55 818 return static_cast<base_type>(NumericTraits<base_type>::sqrt(x * x + y * y));
narshu 1:cc2a9eb0bd55 819 }
narshu 1:cc2a9eb0bd55 820
narshu 1:cc2a9eb0bd55 821 static /* inline */
narshu 1:cc2a9eb0bd55 822 value_type sqrt(argument_type z) {
narshu 1:cc2a9eb0bd55 823 // borrowed and adapted from header complex
narshu 1:cc2a9eb0bd55 824 base_type x = z.real();
narshu 1:cc2a9eb0bd55 825 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 826
narshu 1:cc2a9eb0bd55 827 if(x == base_type()) {
narshu 1:cc2a9eb0bd55 828 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 829 NumericTraits<base_type>::abs(y) / 2);
narshu 1:cc2a9eb0bd55 830 return value_type(t, y < base_type() ? -t : t);
narshu 1:cc2a9eb0bd55 831 }
narshu 1:cc2a9eb0bd55 832 else {
narshu 1:cc2a9eb0bd55 833 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 834 2 * (traits_type::abs(z)
narshu 1:cc2a9eb0bd55 835 + NumericTraits<base_type>::abs(x)));
narshu 1:cc2a9eb0bd55 836 base_type u = t / 2;
narshu 1:cc2a9eb0bd55 837 return x > base_type()
narshu 1:cc2a9eb0bd55 838 ? value_type(u, y / t)
narshu 1:cc2a9eb0bd55 839 : value_type(NumericTraits<base_type>::abs(y) / t, y < base_type() ? -u : u);
narshu 1:cc2a9eb0bd55 840 }
narshu 1:cc2a9eb0bd55 841 }
narshu 1:cc2a9eb0bd55 842
narshu 1:cc2a9eb0bd55 843 static inline
narshu 1:cc2a9eb0bd55 844 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 845 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 846 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 847 }
narshu 1:cc2a9eb0bd55 848
narshu 1:cc2a9eb0bd55 849 static inline
narshu 1:cc2a9eb0bd55 850 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 851
narshu 1:cc2a9eb0bd55 852 static inline
narshu 1:cc2a9eb0bd55 853 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 854 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 855 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 856 }
narshu 1:cc2a9eb0bd55 857
narshu 1:cc2a9eb0bd55 858 static inline
narshu 1:cc2a9eb0bd55 859 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 860 return (traits_type::real(lhs) == traits_type::real(rhs))
narshu 1:cc2a9eb0bd55 861 && (traits_type::imag(lhs) == traits_type::imag(rhs));
narshu 1:cc2a9eb0bd55 862 }
narshu 1:cc2a9eb0bd55 863
narshu 1:cc2a9eb0bd55 864 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 865
narshu 1:cc2a9eb0bd55 866 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 867 enum {
narshu 1:cc2a9eb0bd55 868 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 869 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 870 };
narshu 1:cc2a9eb0bd55 871 };
narshu 1:cc2a9eb0bd55 872
narshu 1:cc2a9eb0bd55 873
narshu 1:cc2a9eb0bd55 874 /**
narshu 1:cc2a9eb0bd55 875 * \class NumericTraits< std::complex<unsigned int> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 876 * \brief Traits specialized for std::complex<unsigned int>.
narshu 1:cc2a9eb0bd55 877 *
narshu 1:cc2a9eb0bd55 878 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 879 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 880 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 881 * this function is missing here.
narshu 1:cc2a9eb0bd55 882 */
narshu 1:cc2a9eb0bd55 883 template<>
narshu 1:cc2a9eb0bd55 884 struct NumericTraits< std::complex<unsigned int> > {
narshu 1:cc2a9eb0bd55 885 typedef unsigned int base_type;
narshu 1:cc2a9eb0bd55 886 typedef std::complex<unsigned int> value_type;
narshu 1:cc2a9eb0bd55 887 typedef std::complex<unsigned long> sum_type;
narshu 1:cc2a9eb0bd55 888 typedef std::complex<int> diff_type;
narshu 1:cc2a9eb0bd55 889 typedef std::complex<float> float_type;
narshu 1:cc2a9eb0bd55 890 typedef std::complex<int> signed_type;
narshu 1:cc2a9eb0bd55 891
narshu 1:cc2a9eb0bd55 892 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 893 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 894
narshu 1:cc2a9eb0bd55 895 static inline
narshu 1:cc2a9eb0bd55 896 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 897
narshu 1:cc2a9eb0bd55 898 static inline
narshu 1:cc2a9eb0bd55 899 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 900
narshu 1:cc2a9eb0bd55 901 static inline
narshu 1:cc2a9eb0bd55 902 base_type abs(argument_type z) {
narshu 1:cc2a9eb0bd55 903 base_type x = z.real();
narshu 1:cc2a9eb0bd55 904 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 905
narshu 1:cc2a9eb0bd55 906 // XXX probably case of overrun; header complex uses scaling
narshu 1:cc2a9eb0bd55 907 return static_cast<base_type>(NumericTraits<base_type>::sqrt(x * x + y * y));
narshu 1:cc2a9eb0bd55 908 }
narshu 1:cc2a9eb0bd55 909
narshu 1:cc2a9eb0bd55 910 static /* inline */
narshu 1:cc2a9eb0bd55 911 value_type sqrt(argument_type z) {
narshu 1:cc2a9eb0bd55 912 // borrowed and adapted from header complex
narshu 1:cc2a9eb0bd55 913 base_type x = z.real();
narshu 1:cc2a9eb0bd55 914 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 915
narshu 1:cc2a9eb0bd55 916 if(x == base_type()) {
narshu 1:cc2a9eb0bd55 917 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 918 NumericTraits<base_type>::abs(y) / 2);
narshu 1:cc2a9eb0bd55 919 return value_type(t, t);
narshu 1:cc2a9eb0bd55 920 }
narshu 1:cc2a9eb0bd55 921 else {
narshu 1:cc2a9eb0bd55 922 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 923 2 * (traits_type::abs(z)
narshu 1:cc2a9eb0bd55 924 + NumericTraits<base_type>::abs(x)));
narshu 1:cc2a9eb0bd55 925 return value_type(t / 2, y / t);
narshu 1:cc2a9eb0bd55 926 }
narshu 1:cc2a9eb0bd55 927 }
narshu 1:cc2a9eb0bd55 928
narshu 1:cc2a9eb0bd55 929 static inline
narshu 1:cc2a9eb0bd55 930 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 931 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 932 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 933 }
narshu 1:cc2a9eb0bd55 934
narshu 1:cc2a9eb0bd55 935 static inline
narshu 1:cc2a9eb0bd55 936 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 937
narshu 1:cc2a9eb0bd55 938 static inline
narshu 1:cc2a9eb0bd55 939 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 940 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 941 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 942 }
narshu 1:cc2a9eb0bd55 943
narshu 1:cc2a9eb0bd55 944 static inline
narshu 1:cc2a9eb0bd55 945 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 946 return (traits_type::real(lhs) == traits_type::real(rhs))
narshu 1:cc2a9eb0bd55 947 && (traits_type::imag(lhs) == traits_type::imag(rhs));
narshu 1:cc2a9eb0bd55 948 }
narshu 1:cc2a9eb0bd55 949
narshu 1:cc2a9eb0bd55 950 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 951
narshu 1:cc2a9eb0bd55 952 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 953 enum {
narshu 1:cc2a9eb0bd55 954 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 955 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 956 };
narshu 1:cc2a9eb0bd55 957 };
narshu 1:cc2a9eb0bd55 958
narshu 1:cc2a9eb0bd55 959
narshu 1:cc2a9eb0bd55 960 /**
narshu 1:cc2a9eb0bd55 961 * \class NumericTraits< std::complex<long> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 962 * \brief Traits specialized for std::complex<long>.
narshu 1:cc2a9eb0bd55 963 */
narshu 1:cc2a9eb0bd55 964 template<>
narshu 1:cc2a9eb0bd55 965 struct NumericTraits< std::complex<long> > {
narshu 1:cc2a9eb0bd55 966 typedef long base_type;
narshu 1:cc2a9eb0bd55 967 typedef std::complex<long> value_type;
narshu 1:cc2a9eb0bd55 968 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 969 typedef std::complex<long long> sum_type;
narshu 1:cc2a9eb0bd55 970 #else
narshu 1:cc2a9eb0bd55 971 typedef std::complex<long> sum_type;
narshu 1:cc2a9eb0bd55 972 #endif
narshu 1:cc2a9eb0bd55 973 typedef std::complex<int> diff_type;
narshu 1:cc2a9eb0bd55 974 typedef std::complex<float> float_type;
narshu 1:cc2a9eb0bd55 975 typedef std::complex<int> signed_type;
narshu 1:cc2a9eb0bd55 976
narshu 1:cc2a9eb0bd55 977 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 978 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 979
narshu 1:cc2a9eb0bd55 980 static inline
narshu 1:cc2a9eb0bd55 981 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 982
narshu 1:cc2a9eb0bd55 983 static inline
narshu 1:cc2a9eb0bd55 984 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 985
narshu 1:cc2a9eb0bd55 986 static inline
narshu 1:cc2a9eb0bd55 987 value_type conj(argument_type z) { return std::conj(z); }
narshu 1:cc2a9eb0bd55 988
narshu 1:cc2a9eb0bd55 989 static inline
narshu 1:cc2a9eb0bd55 990 base_type abs(argument_type z) {
narshu 1:cc2a9eb0bd55 991 base_type x = z.real();
narshu 1:cc2a9eb0bd55 992 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 993
narshu 1:cc2a9eb0bd55 994 // XXX probably case of overrun; header complex uses scaling
narshu 1:cc2a9eb0bd55 995 return static_cast<base_type>(NumericTraits<base_type>::sqrt(x * x + y * y));
narshu 1:cc2a9eb0bd55 996 }
narshu 1:cc2a9eb0bd55 997
narshu 1:cc2a9eb0bd55 998 static /* inline */
narshu 1:cc2a9eb0bd55 999 value_type sqrt(argument_type z) {
narshu 1:cc2a9eb0bd55 1000 // borrowed and adapted from header complex
narshu 1:cc2a9eb0bd55 1001 base_type x = z.real();
narshu 1:cc2a9eb0bd55 1002 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 1003
narshu 1:cc2a9eb0bd55 1004 if(x == base_type()) {
narshu 1:cc2a9eb0bd55 1005 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1006 NumericTraits<base_type>::abs(y) / 2);
narshu 1:cc2a9eb0bd55 1007 return value_type(t, y < base_type() ? -t : t);
narshu 1:cc2a9eb0bd55 1008 }
narshu 1:cc2a9eb0bd55 1009 else {
narshu 1:cc2a9eb0bd55 1010 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1011 2 * (traits_type::abs(z)
narshu 1:cc2a9eb0bd55 1012 + NumericTraits<base_type>::abs(x)));
narshu 1:cc2a9eb0bd55 1013 base_type u = t / 2;
narshu 1:cc2a9eb0bd55 1014 return x > base_type()
narshu 1:cc2a9eb0bd55 1015 ? value_type(u, y / t)
narshu 1:cc2a9eb0bd55 1016 : value_type(NumericTraits<base_type>::abs(y) / t, y < base_type() ? -u : u);
narshu 1:cc2a9eb0bd55 1017 }
narshu 1:cc2a9eb0bd55 1018 }
narshu 1:cc2a9eb0bd55 1019
narshu 1:cc2a9eb0bd55 1020 static inline
narshu 1:cc2a9eb0bd55 1021 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 1022 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 1023 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1024 }
narshu 1:cc2a9eb0bd55 1025
narshu 1:cc2a9eb0bd55 1026 static inline
narshu 1:cc2a9eb0bd55 1027 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 1028
narshu 1:cc2a9eb0bd55 1029 static inline
narshu 1:cc2a9eb0bd55 1030 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 1031 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 1032 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1033 }
narshu 1:cc2a9eb0bd55 1034
narshu 1:cc2a9eb0bd55 1035 static inline
narshu 1:cc2a9eb0bd55 1036 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 1037 return (traits_type::real(lhs) == traits_type::real(rhs))
narshu 1:cc2a9eb0bd55 1038 && (traits_type::imag(lhs) == traits_type::imag(rhs));
narshu 1:cc2a9eb0bd55 1039 }
narshu 1:cc2a9eb0bd55 1040
narshu 1:cc2a9eb0bd55 1041 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 1042
narshu 1:cc2a9eb0bd55 1043 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 1044 enum {
narshu 1:cc2a9eb0bd55 1045 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 1046 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 1047 };
narshu 1:cc2a9eb0bd55 1048 };
narshu 1:cc2a9eb0bd55 1049
narshu 1:cc2a9eb0bd55 1050
narshu 1:cc2a9eb0bd55 1051 /**
narshu 1:cc2a9eb0bd55 1052 * \class NumericTraits< std::complex<unsigned long> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 1053 * \brief Traits specialized for std::complex<unsigned long>.
narshu 1:cc2a9eb0bd55 1054 *
narshu 1:cc2a9eb0bd55 1055 * \note Normally it doesn't make sense to call <tt>conj</tt>
narshu 1:cc2a9eb0bd55 1056 * for an unsigned type! An unary minus operator
narshu 1:cc2a9eb0bd55 1057 * applied to unsigned type will result unsigned. Therefore
narshu 1:cc2a9eb0bd55 1058 * this function is missing here.
narshu 1:cc2a9eb0bd55 1059 */
narshu 1:cc2a9eb0bd55 1060 template<>
narshu 1:cc2a9eb0bd55 1061 struct NumericTraits< std::complex<unsigned long> > {
narshu 1:cc2a9eb0bd55 1062 typedef unsigned long base_type;
narshu 1:cc2a9eb0bd55 1063 typedef std::complex<unsigned long> value_type;
narshu 1:cc2a9eb0bd55 1064 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 1065 typedef std::complex<unsigned long long> sum_type;
narshu 1:cc2a9eb0bd55 1066 #else
narshu 1:cc2a9eb0bd55 1067 typedef std::complex<unsigned long> sum_type;
narshu 1:cc2a9eb0bd55 1068 #endif
narshu 1:cc2a9eb0bd55 1069 typedef std::complex<long> diff_type;
narshu 1:cc2a9eb0bd55 1070 typedef std::complex<float> float_type;
narshu 1:cc2a9eb0bd55 1071 typedef std::complex<long> signed_type;
narshu 1:cc2a9eb0bd55 1072
narshu 1:cc2a9eb0bd55 1073 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 1074 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 1075
narshu 1:cc2a9eb0bd55 1076 static inline
narshu 1:cc2a9eb0bd55 1077 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 1078
narshu 1:cc2a9eb0bd55 1079 static inline
narshu 1:cc2a9eb0bd55 1080 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 1081
narshu 1:cc2a9eb0bd55 1082 static inline
narshu 1:cc2a9eb0bd55 1083 base_type abs(argument_type z) {
narshu 1:cc2a9eb0bd55 1084 base_type x = z.real();
narshu 1:cc2a9eb0bd55 1085 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 1086
narshu 1:cc2a9eb0bd55 1087 // XXX probably case of overrun; header complex uses scaling
narshu 1:cc2a9eb0bd55 1088 return static_cast<base_type>(NumericTraits<base_type>::sqrt(x * x + y * y));
narshu 1:cc2a9eb0bd55 1089 }
narshu 1:cc2a9eb0bd55 1090
narshu 1:cc2a9eb0bd55 1091 static /* inline */
narshu 1:cc2a9eb0bd55 1092 value_type sqrt(argument_type z) {
narshu 1:cc2a9eb0bd55 1093 // borrowed and adapted from header complex
narshu 1:cc2a9eb0bd55 1094 base_type x = z.real();
narshu 1:cc2a9eb0bd55 1095 base_type y = z.imag();
narshu 1:cc2a9eb0bd55 1096
narshu 1:cc2a9eb0bd55 1097 if(x == base_type()) {
narshu 1:cc2a9eb0bd55 1098 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1099 NumericTraits<base_type>::abs(y) / 2);
narshu 1:cc2a9eb0bd55 1100 return value_type(t, t);
narshu 1:cc2a9eb0bd55 1101 }
narshu 1:cc2a9eb0bd55 1102 else {
narshu 1:cc2a9eb0bd55 1103 base_type t = NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1104 2 * (traits_type::abs(z)
narshu 1:cc2a9eb0bd55 1105 + NumericTraits<base_type>::abs(x)));
narshu 1:cc2a9eb0bd55 1106 return value_type(t / 2, y / t);
narshu 1:cc2a9eb0bd55 1107 }
narshu 1:cc2a9eb0bd55 1108 }
narshu 1:cc2a9eb0bd55 1109
narshu 1:cc2a9eb0bd55 1110 static inline
narshu 1:cc2a9eb0bd55 1111 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 1112 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 1113 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1114 }
narshu 1:cc2a9eb0bd55 1115
narshu 1:cc2a9eb0bd55 1116 static inline
narshu 1:cc2a9eb0bd55 1117 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 1118
narshu 1:cc2a9eb0bd55 1119 static inline
narshu 1:cc2a9eb0bd55 1120 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 1121 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 1122 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1123 }
narshu 1:cc2a9eb0bd55 1124
narshu 1:cc2a9eb0bd55 1125 static inline
narshu 1:cc2a9eb0bd55 1126 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 1127 return (traits_type::real(lhs) == traits_type::real(rhs))
narshu 1:cc2a9eb0bd55 1128 && (traits_type::imag(lhs) == traits_type::imag(rhs));
narshu 1:cc2a9eb0bd55 1129 }
narshu 1:cc2a9eb0bd55 1130
narshu 1:cc2a9eb0bd55 1131 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 1132
narshu 1:cc2a9eb0bd55 1133 /** Complexity on operations.*/
narshu 1:cc2a9eb0bd55 1134 enum {
narshu 1:cc2a9eb0bd55 1135 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 1136 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 1137 };
narshu 1:cc2a9eb0bd55 1138 };
narshu 1:cc2a9eb0bd55 1139
narshu 1:cc2a9eb0bd55 1140
narshu 1:cc2a9eb0bd55 1141 /**
narshu 1:cc2a9eb0bd55 1142 * \class NumericTraits< std::complex<float> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 1143 * \brief Traits specialized for std::complex<float>.
narshu 1:cc2a9eb0bd55 1144 */
narshu 1:cc2a9eb0bd55 1145 template<>
narshu 1:cc2a9eb0bd55 1146 struct NumericTraits< std::complex<float> > {
narshu 1:cc2a9eb0bd55 1147 typedef float base_type;
narshu 1:cc2a9eb0bd55 1148 typedef std::complex<float> value_type;
narshu 1:cc2a9eb0bd55 1149 typedef std::complex<double> sum_type;
narshu 1:cc2a9eb0bd55 1150 typedef std::complex<float> diff_type;
narshu 1:cc2a9eb0bd55 1151 typedef std::complex<float> float_type;
narshu 1:cc2a9eb0bd55 1152 typedef std::complex<float> signed_type;
narshu 1:cc2a9eb0bd55 1153
narshu 1:cc2a9eb0bd55 1154 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 1155 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 1156
narshu 1:cc2a9eb0bd55 1157 static inline
narshu 1:cc2a9eb0bd55 1158 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 1159
narshu 1:cc2a9eb0bd55 1160 static inline
narshu 1:cc2a9eb0bd55 1161 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 1162
narshu 1:cc2a9eb0bd55 1163 static inline
narshu 1:cc2a9eb0bd55 1164 value_type conj(argument_type z) { return std::conj(z); }
narshu 1:cc2a9eb0bd55 1165
narshu 1:cc2a9eb0bd55 1166 static inline
narshu 1:cc2a9eb0bd55 1167 base_type abs(argument_type z) { return std::abs(z); }
narshu 1:cc2a9eb0bd55 1168
narshu 1:cc2a9eb0bd55 1169 static inline
narshu 1:cc2a9eb0bd55 1170 value_type sqrt(argument_type z) { return std::sqrt(z); }
narshu 1:cc2a9eb0bd55 1171
narshu 1:cc2a9eb0bd55 1172 static inline
narshu 1:cc2a9eb0bd55 1173 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 1174 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 1175 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1176 }
narshu 1:cc2a9eb0bd55 1177
narshu 1:cc2a9eb0bd55 1178 static inline
narshu 1:cc2a9eb0bd55 1179 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 1180
narshu 1:cc2a9eb0bd55 1181 static inline
narshu 1:cc2a9eb0bd55 1182 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 1183 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 1184 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1185 }
narshu 1:cc2a9eb0bd55 1186
narshu 1:cc2a9eb0bd55 1187 static inline
narshu 1:cc2a9eb0bd55 1188 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 1189 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 1190 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1191 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 1192
narshu 1:cc2a9eb0bd55 1193 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 1194 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 1195 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 1196 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 1197 }
narshu 1:cc2a9eb0bd55 1198
narshu 1:cc2a9eb0bd55 1199 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 1200
narshu 1:cc2a9eb0bd55 1201 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 1202 enum {
narshu 1:cc2a9eb0bd55 1203 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 1204 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 1205 };
narshu 1:cc2a9eb0bd55 1206 };
narshu 1:cc2a9eb0bd55 1207
narshu 1:cc2a9eb0bd55 1208
narshu 1:cc2a9eb0bd55 1209 /**
narshu 1:cc2a9eb0bd55 1210 * \class NumericTraits< std::complex<double> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 1211 * \brief Traits specialized for std::complex<double>.
narshu 1:cc2a9eb0bd55 1212 */
narshu 1:cc2a9eb0bd55 1213 template<>
narshu 1:cc2a9eb0bd55 1214 struct NumericTraits< std::complex<double> > {
narshu 1:cc2a9eb0bd55 1215 typedef double base_type;
narshu 1:cc2a9eb0bd55 1216 typedef std::complex<double> value_type;
narshu 1:cc2a9eb0bd55 1217 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 1218 typedef std::complex<long double> sum_type;
narshu 1:cc2a9eb0bd55 1219 #else
narshu 1:cc2a9eb0bd55 1220 typedef std::complex<double> sum_type;
narshu 1:cc2a9eb0bd55 1221 #endif
narshu 1:cc2a9eb0bd55 1222 typedef std::complex<double> diff_type;
narshu 1:cc2a9eb0bd55 1223 typedef std::complex<double> float_type;
narshu 1:cc2a9eb0bd55 1224 typedef std::complex<double> signed_type;
narshu 1:cc2a9eb0bd55 1225
narshu 1:cc2a9eb0bd55 1226 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 1227 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 1228
narshu 1:cc2a9eb0bd55 1229 static inline
narshu 1:cc2a9eb0bd55 1230 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 1231
narshu 1:cc2a9eb0bd55 1232 static inline
narshu 1:cc2a9eb0bd55 1233 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 1234
narshu 1:cc2a9eb0bd55 1235 static inline
narshu 1:cc2a9eb0bd55 1236 value_type conj(argument_type z) { return std::conj(z); }
narshu 1:cc2a9eb0bd55 1237
narshu 1:cc2a9eb0bd55 1238 static inline
narshu 1:cc2a9eb0bd55 1239 base_type abs(argument_type z) { return std::abs(z); }
narshu 1:cc2a9eb0bd55 1240
narshu 1:cc2a9eb0bd55 1241 static inline
narshu 1:cc2a9eb0bd55 1242 value_type sqrt(argument_type z) { return std::sqrt(z); }
narshu 1:cc2a9eb0bd55 1243
narshu 1:cc2a9eb0bd55 1244 static inline
narshu 1:cc2a9eb0bd55 1245 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 1246 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 1247 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1248 }
narshu 1:cc2a9eb0bd55 1249
narshu 1:cc2a9eb0bd55 1250 static inline
narshu 1:cc2a9eb0bd55 1251 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 1252
narshu 1:cc2a9eb0bd55 1253 static inline
narshu 1:cc2a9eb0bd55 1254 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 1255 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 1256 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1257 }
narshu 1:cc2a9eb0bd55 1258
narshu 1:cc2a9eb0bd55 1259 static inline
narshu 1:cc2a9eb0bd55 1260 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 1261 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 1262 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1263 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 1264
narshu 1:cc2a9eb0bd55 1265 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 1266 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 1267 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 1268 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 1269 }
narshu 1:cc2a9eb0bd55 1270
narshu 1:cc2a9eb0bd55 1271 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 1272
narshu 1:cc2a9eb0bd55 1273 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 1274 enum {
narshu 1:cc2a9eb0bd55 1275 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 1276 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 1277 };
narshu 1:cc2a9eb0bd55 1278 };
narshu 1:cc2a9eb0bd55 1279
narshu 1:cc2a9eb0bd55 1280
narshu 1:cc2a9eb0bd55 1281 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 1282 /**
narshu 1:cc2a9eb0bd55 1283 * \class NumericTraits< std::complex<long double> > NumericTraits.h "tvmet/NumericTraits.h"
narshu 1:cc2a9eb0bd55 1284 * \brief Traits specialized for std::complex<double>.
narshu 1:cc2a9eb0bd55 1285 */
narshu 1:cc2a9eb0bd55 1286 template<>
narshu 1:cc2a9eb0bd55 1287 struct NumericTraits< std::complex<long double> > {
narshu 1:cc2a9eb0bd55 1288 typedef long double base_type;
narshu 1:cc2a9eb0bd55 1289 typedef std::complex<long double> value_type;
narshu 1:cc2a9eb0bd55 1290 typedef std::complex<long double> sum_type;
narshu 1:cc2a9eb0bd55 1291 typedef std::complex<long double> diff_type;
narshu 1:cc2a9eb0bd55 1292 typedef std::complex<long double> float_type;
narshu 1:cc2a9eb0bd55 1293 typedef std::complex<long double> signed_type;
narshu 1:cc2a9eb0bd55 1294
narshu 1:cc2a9eb0bd55 1295 typedef NumericTraits<value_type> traits_type;
narshu 1:cc2a9eb0bd55 1296 typedef const value_type& argument_type;
narshu 1:cc2a9eb0bd55 1297
narshu 1:cc2a9eb0bd55 1298 static inline
narshu 1:cc2a9eb0bd55 1299 base_type real(argument_type z) { return std::real(z); }
narshu 1:cc2a9eb0bd55 1300
narshu 1:cc2a9eb0bd55 1301 static inline
narshu 1:cc2a9eb0bd55 1302 base_type imag(argument_type z) { return std::imag(z); }
narshu 1:cc2a9eb0bd55 1303
narshu 1:cc2a9eb0bd55 1304 static inline
narshu 1:cc2a9eb0bd55 1305 value_type conj(argument_type z) { return std::conj(z); }
narshu 1:cc2a9eb0bd55 1306
narshu 1:cc2a9eb0bd55 1307 static inline
narshu 1:cc2a9eb0bd55 1308 base_type abs(argument_type z) { return std::abs(z); }
narshu 1:cc2a9eb0bd55 1309
narshu 1:cc2a9eb0bd55 1310 static inline
narshu 1:cc2a9eb0bd55 1311 value_type sqrt(argument_type z) { return std::sqrt(z); }
narshu 1:cc2a9eb0bd55 1312
narshu 1:cc2a9eb0bd55 1313 static inline
narshu 1:cc2a9eb0bd55 1314 base_type norm_1(argument_type z) {
narshu 1:cc2a9eb0bd55 1315 return NumericTraits<base_type>::abs((traits_type::real(z)))
narshu 1:cc2a9eb0bd55 1316 + NumericTraits<base_type>::abs((traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1317 }
narshu 1:cc2a9eb0bd55 1318
narshu 1:cc2a9eb0bd55 1319 static inline
narshu 1:cc2a9eb0bd55 1320 base_type norm_2(argument_type z) { return traits_type::abs(z); }
narshu 1:cc2a9eb0bd55 1321
narshu 1:cc2a9eb0bd55 1322 static inline
narshu 1:cc2a9eb0bd55 1323 base_type norm_inf(argument_type z) {
narshu 1:cc2a9eb0bd55 1324 return std::max(NumericTraits<base_type>::abs(traits_type::real(z)),
narshu 1:cc2a9eb0bd55 1325 NumericTraits<base_type>::abs(traits_type::imag(z)));
narshu 1:cc2a9eb0bd55 1326 }
narshu 1:cc2a9eb0bd55 1327
narshu 1:cc2a9eb0bd55 1328 static inline
narshu 1:cc2a9eb0bd55 1329 bool equals(argument_type lhs, argument_type rhs) {
narshu 1:cc2a9eb0bd55 1330 static base_type sqrt_epsilon(
narshu 1:cc2a9eb0bd55 1331 NumericTraits<base_type>::sqrt(
narshu 1:cc2a9eb0bd55 1332 std::numeric_limits<base_type>::epsilon()));
narshu 1:cc2a9eb0bd55 1333
narshu 1:cc2a9eb0bd55 1334 return traits_type::norm_inf(lhs - rhs) < sqrt_epsilon *
narshu 1:cc2a9eb0bd55 1335 std::max(std::max(traits_type::norm_inf(lhs),
narshu 1:cc2a9eb0bd55 1336 traits_type::norm_inf(rhs)),
narshu 1:cc2a9eb0bd55 1337 std::numeric_limits<base_type>::min());
narshu 1:cc2a9eb0bd55 1338 }
narshu 1:cc2a9eb0bd55 1339
narshu 1:cc2a9eb0bd55 1340 enum { is_complex = true };
narshu 1:cc2a9eb0bd55 1341
narshu 1:cc2a9eb0bd55 1342 /** Complexity on operations. */
narshu 1:cc2a9eb0bd55 1343 enum {
narshu 1:cc2a9eb0bd55 1344 ops_plus = 2, /**< Complexity on plus/minus ops. */
narshu 1:cc2a9eb0bd55 1345 ops_muls = 6 /**< Complexity on multiplications. */
narshu 1:cc2a9eb0bd55 1346 };
narshu 1:cc2a9eb0bd55 1347 };
narshu 1:cc2a9eb0bd55 1348 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 1349
narshu 1:cc2a9eb0bd55 1350
narshu 1:cc2a9eb0bd55 1351 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 1352
narshu 1:cc2a9eb0bd55 1353
narshu 1:cc2a9eb0bd55 1354 } // namespace tvmet
narshu 1:cc2a9eb0bd55 1355
narshu 1:cc2a9eb0bd55 1356
narshu 1:cc2a9eb0bd55 1357 #endif // TVMET_NUMERIC_TRAITS_H
narshu 1:cc2a9eb0bd55 1358
narshu 1:cc2a9eb0bd55 1359
narshu 1:cc2a9eb0bd55 1360 // Local Variables:
narshu 1:cc2a9eb0bd55 1361 // mode:C++
narshu 1:cc2a9eb0bd55 1362 // tab-width:8
narshu 1:cc2a9eb0bd55 1363 // End: