Fix a couple of mjtNum build errors.
PiperOrigin-RevId: 645024056 Change-Id: Id283f550a4e2d927c214a86e77d42b90fb02824e
This commit is contained in:
committed by
Copybara-Service
parent
18634b6726
commit
73cd15344e
+15
-4
@@ -177,6 +177,17 @@ std::vector<mjtNum> GetCtrlNoise(const mjModel* m, int nsteps,
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto Compare(T val1, T val2);
|
||||
|
||||
auto Compare(char val1, char val2) {
|
||||
return val1 != val2;
|
||||
}
|
||||
|
||||
auto Compare(unsigned char val1, unsigned char val2) {
|
||||
return val1 != val2;
|
||||
}
|
||||
|
||||
// The maximum spacing between a normalised floating point number x and an
|
||||
// adjacent normalised number is 2 epsilon |x|; a factor 10 is added accounting
|
||||
// for losses during non-idempotent operations such as vector normalizations.
|
||||
@@ -185,13 +196,13 @@ auto Compare(T val1, T val2) {
|
||||
using ReturnType =
|
||||
std::conditional_t<std::is_same_v<T, float>, float, double>;
|
||||
ReturnType error;
|
||||
if (mju_abs(val1) <= 1 || mju_abs(val2) <= 1) {
|
||||
if (std::abs(val1) <= 1 || std::abs(val2) <= 1) {
|
||||
// Absolute precision for small numbers
|
||||
error = mju_abs(val1-val2);
|
||||
error = std::abs(val1-val2);
|
||||
} else {
|
||||
// Relative precision for larger numbers
|
||||
ReturnType magnitude = mju_abs(val1) + mju_abs(val2);
|
||||
error = mju_abs(val1/magnitude - val2/magnitude) / magnitude;
|
||||
ReturnType magnitude = std::abs(val1) + std::abs(val2);
|
||||
error = std::abs(val1/magnitude - val2/magnitude) / magnitude;
|
||||
}
|
||||
ReturnType safety_factor = 200;
|
||||
return error < safety_factor * std::numeric_limits<ReturnType>::epsilon()
|
||||
|
||||
Reference in New Issue
Block a user