首页 > 解决方案 > 高于给定值的最小可表达值

问题描述

给定一个定义为的变量

T x;

哪里T是通用算术类型(即,这样std::is_arithmetic<T>::value),是否有一个简单的表达式(例如来自 的东西),std::numeric_limits其计算结果为可表示的最低值> ?yTyx

(即一种广义增量..)

标签: c++c++14typetraitsnumeric-limits

解决方案


您可以使用std::nextafter.

请注意,我在这里使用std::numeric_limits<Floating>::max(),如果您想要对无穷大有意义的行为,您可能需要修改代码。

#include <iostream>
#include <limits>
#include <cmath>
#include <type_traits>
#include <iomanip>

template <typename Floating,
    std::enable_if_t<std::is_arithmetic_v<Floating> && !std::is_integral_v<Floating>, bool> = false>
Floating generic_next_val(Floating val) {
    return std::nextafter(val, std::numeric_limits<Floating>::max());
}

template <typename Integral,
    std::enable_if_t<std::is_arithmetic_v<Integral> && std::is_integral_v<Integral>, int> = 0>
Integral generic_next_val(Integral val) {
    return static_cast<Integral>(val + static_cast<Integral>(1));
}

int main() {
    int a = 1;
    float f = 0.0f;
    std::cout << std::setprecision(20) << generic_next_val(f) << " " << generic_next_val(a) << std::endl;
    return 0;
}

推荐阅读