PSMoveFloatVector2 PSMoveFloatVector2::safe_divide(const PSMoveFloatVector2 &v, const PSMoveFloatVector2 &default_result) const
{
    return
        PSMoveFloatVector2::create(
            !is_nearly_zero(v.i) ? i / v.i : default_result.i,
            !is_nearly_zero(v.j) ? j / v.j : default_result.j);
}
PSMoveFloatVector3 PSMoveFloatVector3::safe_divide(const PSMoveFloatVector3 &v, const PSMoveFloatVector3 &default_result) const
{
    return 
        PSMoveFloatVector3::create(
            !is_nearly_zero(v.i) ? i/v.i : default_result.i,
            !is_nearly_zero(v.j) ? j/v.j : default_result.j,
            !is_nearly_zero(v.k) ? k/v.k : default_result.k);
}
Eigen::Quaternionf OrientationFilter::getOrientation(float time) const
{
    Eigen::Quaternionf predicted_orientation = 
        is_nearly_zero(time) 
        ? m_FusionState->orientation
        : Eigen::Quaternionf(
            m_FusionState->orientation.coeffs() 
            + m_FusionState->orientation_first_derivative.coeffs()*time).normalized();
    Eigen::Quaternionf result = m_FusionState->reset_orientation * predicted_orientation;

    return result;
}
PSMoveFloatVector2 PSMoveFloatVector2::safe_divide(const float s, const PSMoveFloatVector2 &default_result) const
{
    return !is_nearly_zero(s) ? unsafe_divide(s) : default_result;
}
PSMoveQuaternion PSMoveQuaternion::safe_divide(const float s, const PSMoveQuaternion &default_result) const
{
    return !is_nearly_zero(s) ? unsafe_divide(s) : default_result;
}
float safe_sqrt_with_default(float square, float default_result)
{
    return is_nearly_zero(square) ? default_result : sqrtf(square);
}
//-- float methods -----
float safe_divide_with_default(float numerator, float denomenator, float default_result) 
{
    return is_nearly_zero(denomenator) ? default_result : (numerator / denomenator);
}