我有一个程序,需要将变量设置为 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
设置为可表示的最低双精度?
一旦你有了 -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 的幂。
<cfloat>
/<float.h>
提供定义浮点实现参数的宏。
这个问题有点模棱两可 - 目前尚不清楚您的意思是“最小幅度”可表示的非零值(即“DBL_MIN
”)还是“最低”
可表示值(由“
-DBL_MAX
”给出)。 无论哪种方式 - 根据需要进行选择。
事实证明,我用来打印值的 iostream 中有一个错误。我改用 cstdio 而不是 iostream。然后按预期打印这些值。 double low_value = - std::numeric_limits<double>::max();
cout <<"cout: " << low_value << endl;
printf("printf: %f\n",low_value);
输出:
cout: inf
printf: 179769...