C++ 如何在C++;对于整数和浮点数?
我天真地尝试了C++ 如何在C++;对于整数和浮点数?,c++,c++11,numbers,numeric-limits,C++,C++11,Numbers,Numeric Limits,我天真地尝试了 template<typename T> void foo(T a, T b){ if(min==max){ max += std::numeric_limits<T>::epsilon(); } // Do some other stuff } 模板 无效foo(T a,T b){ 如果(最小值==最大值){ max+=std::numeric_limits::epsilon(); } //做些别的事情 } 然而,我发现
template<typename T>
void foo(T a, T b){
if(min==max){
max += std::numeric_limits<T>::epsilon();
}
// Do some other stuff
}
模板
无效foo(T a,T b){
如果(最小值==最大值){
max+=std::numeric_limits::epsilon();
}
//做些别的事情
}
然而,我发现epsilon对整数类型返回0,而不是1,这似乎是一个疏忽。如何解决上述包括整数的问题?例如:
template<typename T>
T next(T v) {
if constexpr (std::is_integral_v<T>) {
return v + 1;
} else {
return std::nextafter(v, std::numeric_limits<T>::infinity);
}
}
对于许多浮点值,v+epsilon==v
。对于许多其他值,它将跳过相邻值。例如:
template<typename T>
T next(T v) {
if constexpr (std::is_integral_v<T>) {
return v + 1;
} else {
return std::nextafter(v, std::numeric_limits<T>::infinity);
}
}
对于许多浮点值,
v+epsilon==v
。对于许多其他值,它将跳过相邻值。对于整数max
下一个较大的值是max+1
。执行此操作之前,请检查max
是否已经是可表示的最大值。对于整数max
,下一个较大的值是max+1
。在执行此操作之前,请检查max
是否已经是可表示的最大值。如果抱歉,C++11没有constexpr!!虽然这是一个很好的答案,但C++11没有constexpr,如果我很抱歉的话!!虽然这是一个很好的答案