如何在 C++ 中获得可表示的最低浮点值

问题描述 投票:0回答:3

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

我尝试使用

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
设置为可表示的最低双精度?

c++ floating-point standard-library
3个回答
2
投票

一旦你有了 -inf (你得到了它),你就可以使用 (-inf,0) 上的 nextafter 函数获得最低的有限值。

编辑:根据上下文,如果

-DBL_MAX
以十进制表示(因此以不精确的方式),这可能比
DBL_MAX
更好。然而,C 标准要求以默认舍入模式(即最接近)计算浮点常量。在 GCC 的特定情况下,
DBL_MAX
是一个 long double 值,转换为 double;然而,长双精度值似乎有足够的数字,因此,一旦从十进制转换为长双精度值,该值就可以精确地表示为双精度,因此强制转换是精确的,并且活动舍入模式不会影响它。正如您所看到的,这是相当棘手的,人们可能想在各种平台上检查它在任何情况下是否正确。以类似的方式,我对 PowerPC 上的 GCC 定义
DBL_EPSILON
的正确性表示严重怀疑(其中long double类型被实现为double-double算术),因为有许多 long double 值非常接近2 的幂。


0
投票

标准库

<cfloat>
/
<float.h>
提供定义浮点实现参数的宏。

这个问题有点模棱两可 - 目前尚不清楚您的意思是“最小幅度”可表示的非零值(即“DBL_MIN”)还是“最低”

可表示值(由“
-DBL_MAX”给出)。 无论哪种方式 - 根据需要进行选择。

事实证明,我用来打印值的 iostream 中有一个错误。我改用 cstdio 而不是 iostream。然后按预期打印这些值。

0
投票
double low_value = - std::numeric_limits<double>::max(); cout <<"cout: " << low_value << endl; printf("printf: %f\n",low_value);

输出:

cout: inf printf: 179769...


© www.soinside.com 2019 - 2024. All rights reserved.