c++ - 如何在 C++ 中获取最低可表示浮点值

标签 c++ standard-library

我有一个程序,我需要将一个变量设置为 C++ 中可表示的最低(非无限) double float 。我如何才能将变量设置为最低的 double 浮点值?

我尝试使用 std::numeric_limits。我没有使用 C++11,所以我无法尝试使用 lowest() 函数。我尝试使用 max(),但当我尝试时,它返回了无穷大。我还尝试从 max() 中减去一个值,希望我能得到一个可表示的数字。

double max_value = std::numeric_limits<double>::max();
cout << "Test 1: " << max_value << endl;    
max_value = max_value - 1;
cout << "Test 2: " << max_value << endl;
double low_value = - std::numeric_limits<double>::max();
cout << "Test 3: " << low_value << endl;
cout << "Test 4: " << low_value + 1 << endl;

输出:

Test 1: inf
Test 2: inf
Test 3: -inf
Test 4: -inf

如何将上例中的 low_value 设置为最低的可表示 double 值?

最佳答案

一旦你有了 -inf(你得到它),你就可以用 nextafter 得到最小的有限值。在 (-inf,0) 上运行。

编辑:根据上下文,如果 DBL_MAX 以十进制表示(因此以不精确的方式),这可能比 -DBL_MAX 更好。但是,C 标准要求以默认舍入模式(即最接近)评估 float 常量。在 GCC 的特殊情况下,DBL_MAX 是一个转换为 double 的 long double 值;但是 long double 值似乎有足够的数字,因此一旦从 decimal 转换为 long double,该值就可以精确地表示为 double,因此转换是精确的,并且事件舍入模式不会影响它。如您所见,这是相当棘手的,人们可能想在各种平台上检查它在任何上下文中是否正确。以类似的方式,我严重怀疑 GCC 在 PowerPC 上定义 DBL_EPSILON 的正确性(其中 long double 类型实现为 double-double arithmetic ),因为有很多 long double 值非常接近二的幂。

关于c++ - 如何在 C++ 中获取最低可表示浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24683930/

相关文章:

C++ 可变参数模板 - NULL 转换为 int

c++ - 如何解决 numeric_limits<T>::min() 的不一致定义?

c++ - `cname` 和 `name.h` 中的类型可以是不同的类型吗?

c++ - 如何 tuple<Ts...>& base = t;在元组实现中工作

C++11 线程等待行为:std::this_thread::yield() 与 std::this_thread::sleep_for( std::chrono::milliseconds(1) )

c - 在 Windows 上学习 C

installation - 加载Agda标准库

c++ - 我怎样才能通过引用弹出一些东西?

c++ - 从全局位置/旋转/比例更新本地位置/旋转/比例?

c++ - QComboBox 不调用委托(delegate)方法