【发布时间】:2014-07-10 18:38:03
【问题描述】:
我有一个程序,我需要将一个变量设置为 C++ 中可表示的最低(非无限)双精度浮点数。如何将变量设置为最低的双精度浮点值?
我尝试使用 std::numeric_limits。我没有使用 C++11,所以我无法尝试使用最低()函数。我尝试使用 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++11) 标准的 18.3.2.4 说 max() 是有限的。所以我猜 double 或 ostream 的实现是错误的。或者您可以尝试摆弄编译器选项,例如“精确浮点计算”等价物。
-
@PeterSchneider OP:“......我没有使用 C++11......”......
-
只是出于好奇,
cout << std::numeric_limits<double>::max()会打印什么? gcc wiki 有一些关于 80 位精度硬件与双打内存布局引起的问题的信息,但我不确定它是否真的适用于这里:gcc.gnu.org/wiki/FloatingPointMath -
@Theolodis 这是我这里的那个;我无法想象
max()s 的定义在标准之间发生了变化。毕竟不是max_plus_epsilon();-) -
'cout ::max()' 也打印无穷大。我的 iostream 一定有问题。
标签: c++ standard-library