author Sam Moore Sun, 3 Aug 2014 13:55:56 +0000 (21:55 +0800) committer Sam Moore Sun, 3 Aug 2014 13:55:56 +0000 (21:55 +0800)
There are many reasons why that was terrible and it finally all came apart
in a segfaultastic display.

We now have Power which only works for integer powers
But we only need those at the moment anyway.

 src/bezier.cpp patch | blob | history src/rational.h patch | blob | history src/real.cpp patch | blob | history src/real.h patch | blob | history src/vfpu.h patch | blob | history src/view.cpp patch | blob | history

index 15a5069..c71d0a9 100644 (file)
@@ -42,7 +42,7 @@ int BinomialCoeff(int n, int k)
*/
Real Bernstein(int k, int n, const Real & u)
{
-       return Real(BinomialCoeff(n, k)) * pow(u, k) * pow(Real(1.0) - u, n-k);
+       return Real(BinomialCoeff(n, k)) * Power(u, k) * Power(Real(1.0) - u, n-k);
}

}
index 6bc5aec..595f5f2 100644 (file)
@@ -196,13 +196,6 @@ struct Rational
T Q;
};

-inline Rational<int64_t> pow(const Rational<int64_t> & a, const Rational<int64_t> & b)
-{
-       //TODO:Implement properly
-       int64_t P = std::pow((double)a.P, b.ToDouble());
-       int64_t Q = std::pow((double)a.Q, b.ToDouble());
-       return Rational<int64_t>(P, Q);
-}

index 96d8054..0f104e5 100644 (file)
@@ -7,7 +7,7 @@ namespace IPDF
"single",
"double",
"long double",
-               "single [fast2sum]", //TODO REMOVE DOESN'T DO ANYTHING USEFUL
+               "VFPU",
"Rational<int64_t>",
"Rational<Arbint>"
};
index 4b2db1c..d8033fc 100644 (file)
@@ -54,12 +54,7 @@ namespace IPDF
typedef Rational<ARBINT> Real;
inline float Float(const Real & r) {return (float)r.ToDouble();}
inline double Double(const Real & r) {return r.ToDouble();}
-       inline Rational<ARBINT> pow(const Rational<ARBINT> & a, const Rational<ARBINT> & b)
-       {
-               ARBINT P(std::pow(static_cast<double>(a.P), b.ToDouble()));
-               ARBINT Q(std::pow(static_cast<double>(a.Q), b.ToDouble()));
-               return Rational<ARBINT>(P,Q);
-       }
+
#else
#error "Type of Real unspecified."
#endif //REAL
@@ -73,6 +68,19 @@ namespace IPDF
inline double Double(float f) {return (double)f;}
inline double Double(double f) {return (double)f;}
inline double Double(long double f) {return (double)(f);}
+
+       inline Real Power(const Real & a, int n)
+       {
+               if (n < 0)
+               {
+                       return Power(Real(1)/a, -n);
+               }
+               Real r(1);
+               for (int i = 0; i < n; ++i)
+                       r *= a;
+               return r;
+       }
+
}

#endif //_REAL_H
index a2102f9..8444afd 100644 (file)
@@ -86,11 +86,6 @@ namespace VFPU
float m_value;

};
-
-       inline Float pow(const Float & a, const Float & b)
-       {
-               return Float(pow(a.m_value, b.m_value));
-       }
}

#endif //_VFPU_H
index 1fe0728..54e4155 100644 (file)
@@ -183,7 +183,7 @@ void View::RenderQuadtreeNode(int width, int height, QuadTreeIndex node, int rem
Rect old_bounds = m_bounds;