summaryrefslogtreecommitdiffstats
path: root/vec_pseudo.h
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2013-06-28 14:04:29 -0400
committerErik Schnetter <schnetter@gmail.com>2013-06-28 14:04:29 -0400
commitba43da889e5d662eedb4c2957162b4d9254557f9 (patch)
tree839bf17b2201bd5b912c461cd36a63e97a4200ab /vec_pseudo.h
parent137ce80e5535eb98872e5b49970fad2615cb57fe (diff)
downloadvecmathlib-ba43da889e5d662eedb4c2957162b4d9254557f9.zip
vecmathlib-ba43da889e5d662eedb4c2957162b4d9254557f9.tar.gz
Implement frexp
Diffstat (limited to 'vec_pseudo.h')
-rw-r--r--vec_pseudo.h20
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)
{
OpenPOWER on IntegriCloud