Correct epicsMin/epicsMax behaviour for floating-point NaN arguments.
This commit is contained in:
@@ -13,18 +13,61 @@
|
||||
#ifndef __EPICS_ALGORITHM_H__
|
||||
#define __EPICS_ALGORITHM_H__
|
||||
|
||||
template <class T>
|
||||
inline const T& epicsMax (const T& a, const T& b)
|
||||
{
|
||||
return (a<b) ? b : a;
|
||||
}
|
||||
#include "epicsMath.h"
|
||||
|
||||
// The C++ standard only requires types to be less-than comparable, so
|
||||
// the epicsMin and epicsMax templates only use operator <
|
||||
|
||||
// epicsMin
|
||||
|
||||
template <class T>
|
||||
inline const T& epicsMin (const T& a, const T& b)
|
||||
{
|
||||
return (a<b) ? a : b;
|
||||
return (b < a) ? b : a;
|
||||
}
|
||||
|
||||
// If b is a NaN the above template returns a, but should return NaN.
|
||||
// These specializations ensure that epicsMin(x,NaN) == NaN
|
||||
|
||||
template <>
|
||||
inline const float& epicsMin (const float& a, const float& b)
|
||||
{
|
||||
return (b < a) || isnan(b) ? b : a;
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const double& epicsMin (const double& a, const double& b)
|
||||
{
|
||||
return (b < a) || isnan(b) ? b : a;
|
||||
}
|
||||
|
||||
|
||||
// epicsMax
|
||||
|
||||
template <class T>
|
||||
inline const T& epicsMax (const T& a, const T& b)
|
||||
{
|
||||
return (a < b) ? b : a;
|
||||
}
|
||||
|
||||
// If b is a NaN the above template returns a, but should return NaN.
|
||||
// These specializations ensure that epicsMax(x,NaN) == NaN
|
||||
|
||||
template <>
|
||||
inline const float& epicsMax (const float& a, const float& b)
|
||||
{
|
||||
return (a < b) || isnan(b) ? b : a;
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const double& epicsMax (const double& a, const double& b)
|
||||
{
|
||||
return (a < b) || isnan(b) ? b : a;
|
||||
}
|
||||
|
||||
|
||||
// epicsSwap
|
||||
|
||||
template <class T>
|
||||
inline void epicsSwap(T& a, T& b)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user