|
|
@@ -15,13 +15,14 @@ namespace ulp
|
|
|
{
|
|
|
inline std::size_t ulp
|
|
|
(
|
|
|
- double const & a,
|
|
|
- double const & b
|
|
|
+ half const & a,
|
|
|
+ half const & b
|
|
|
)
|
|
|
{
|
|
|
std::size_t Count = 0;
|
|
|
- double Temp = a;
|
|
|
- while((Temp = nextafterf(Temp, b)) != b)
|
|
|
+ float TempA = a;
|
|
|
+ float TempB = b;
|
|
|
+ while((TempA = nextafterf(TempA, TempB)) != TempB)
|
|
|
++Count;
|
|
|
return Count;
|
|
|
}
|
|
|
@@ -38,6 +39,59 @@ namespace ulp
|
|
|
++Count;
|
|
|
return Count;
|
|
|
}
|
|
|
+
|
|
|
+ inline std::size_t ulp
|
|
|
+ (
|
|
|
+ double const & a,
|
|
|
+ double const & b
|
|
|
+ )
|
|
|
+ {
|
|
|
+ std::size_t Count = 0;
|
|
|
+ double Temp = a;
|
|
|
+ while((Temp = nextafter(Temp, b)) != b)
|
|
|
+ ++Count;
|
|
|
+ return Count;
|
|
|
+ }
|
|
|
+
|
|
|
+ template <typename valType>
|
|
|
+ inline detail::xvec2<valType> ulp
|
|
|
+ (
|
|
|
+ detail::xvec2<valType> const & a,
|
|
|
+ detail::xvec2<valType> const & b
|
|
|
+ )
|
|
|
+ {
|
|
|
+ return detail::xvec2<valType>(
|
|
|
+ ulp(a[0], b[0]),
|
|
|
+ ulp(a[1], b[1]));
|
|
|
+ }
|
|
|
+
|
|
|
+ template <typename valType>
|
|
|
+ inline detail::xvec3<valType> ulp
|
|
|
+ (
|
|
|
+ detail::xvec3<valType> const & a,
|
|
|
+ detail::xvec3<valType> const & b
|
|
|
+ )
|
|
|
+ {
|
|
|
+ return detail::xvec2<valType>(
|
|
|
+ ulp(a[0], b[0]),
|
|
|
+ ulp(a[1], b[1]),
|
|
|
+ ulp(a[2], b[2]));
|
|
|
+ }
|
|
|
+
|
|
|
+ template <typename valType>
|
|
|
+ inline detail::xvec4<valType> ulp
|
|
|
+ (
|
|
|
+ detail::xvec4<valType> const & a,
|
|
|
+ detail::xvec4<valType> const & b
|
|
|
+ )
|
|
|
+ {
|
|
|
+ return detail::xvec2<valType>(
|
|
|
+ ulp(a[0], b[0]),
|
|
|
+ ulp(a[1], b[1]),
|
|
|
+ ulp(a[2], b[2]),
|
|
|
+ ulp(a[3], b[3]));
|
|
|
+ }
|
|
|
+
|
|
|
}//namespace ulp
|
|
|
}//namespace gtx
|
|
|
}//namespace glm
|