diff options
author | Erik Schnetter <schnetter@gmail.com> | 2013-06-28 14:04:29 -0400 |
---|---|---|
committer | Erik Schnetter <schnetter@gmail.com> | 2013-06-28 14:04:29 -0400 |
commit | ba43da889e5d662eedb4c2957162b4d9254557f9 (patch) | |
tree | 839bf17b2201bd5b912c461cd36a63e97a4200ab /vec_pseudo.h | |
parent | 137ce80e5535eb98872e5b49970fad2615cb57fe (diff) | |
download | vecmathlib-ba43da889e5d662eedb4c2957162b4d9254557f9.zip vecmathlib-ba43da889e5d662eedb4c2957162b4d9254557f9.tar.gz |
Implement frexp
Diffstat (limited to 'vec_pseudo.h')
-rw-r--r-- | vec_pseudo.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/vec_pseudo.h b/vec_pseudo.h index 0764d94..c3658c0 100644 --- a/vec_pseudo.h +++ b/vec_pseudo.h @@ -746,6 +746,19 @@ namespace vecmathlib { realpseudovec fmax(realpseudovec y) const { return map(std::fmax, y); } realpseudovec fmin(realpseudovec y) const { return map(std::fmin, y); } realpseudovec fmod(realpseudovec y) const { return map(std::fmod, y); } + realpseudovec frexp(intvec_t& ires) const + { + realvec_t res; + for (int d=0; d<size; ++d) { + int ir; + real_t r = std::frexp(v[d], &ir); + if (ir == FP_ILOGB0) ir = std::numeric_limits<int_t>::min(); + else if (ir == FP_ILOGBNAN) ir = std::numeric_limits<int_t>::max(); + res.v[d] = r; + ires.v[d] = ir; + } + return res; + } realpseudovec hypot(realpseudovec y) const { return map(std::hypot, y); } intvec_t ilogb() const { @@ -1203,6 +1216,13 @@ namespace vecmathlib { } template<typename real_t, int size> + inline realpseudovec<real_t, size> frexp(realpseudovec<real_t, size> x, + intpseudovec<real_t, size>& r) + { + return x.frexp(r); + } + + template<typename real_t, int size> inline realpseudovec<real_t, size> hypot(realpseudovec<real_t, size> x, realpseudovec<real_t, size> y) { |