我想将一个double值从它可以采用的最小可能(负)值增加到它可以采用的最大可能值。
我从这开始:
int main()
{
double min(numeric_limits<double>::min());
double i(min);
while(i < 0);
{
cout << i << endl;
i += min ;
}
}
不幸的是,这不会产生预期的结果 - 在一次迭代后跳过while循环。
有没有更好的方法来实现我的目标?
答案 0 :(得分:4)
我猜你的代码是什么:你想从最大可能的负值开始,并以尽可能小的步长将其增加到正无穷大,直到该值不再为负。
我认为你想要的功能是nextafter()
。
int main() {
double value(-std::numeric_limits<double>::max());
while(value < 0) {
std::cout << value << '\n';
value = std::nextafter(value,std::numeric_limits<double>::infinity());
}
}
答案 1 :(得分:0)
首先,
while(i < 0); // <--- remove this semicolon
{
cout << i << endl;
i += min ;
}
然后,std::numeric_limits<double>::min()
is a positive value,所以i < 0
永远不会成真。如果您需要最负值,则需要
double min = -std::numeric_limits<double>::max();
但我不知道你的i += min
行应该做什么。添加两个最负数将只产生-∞,并且循环永远不会完成。如果你想添加一个数字,你需要另一个变量,比如
double most_negative = -std::numeric_limits<double>::max();
double most_positive = std::numeric_limits<double>::max();
double i = most_negative;
while (i < 0)
{
std::cout << i << std::endl;
i += most_positive;
}
当然这只会打印最负数(-1.8e + 308),然后i
变为0并且循环将退出。
答案 2 :(得分:0)
以下按顺序遍历所有浮点值。当u.mind增加时,连续值之间的步骤变小。 不能保证这是正确的,并且需要很长时间才能完成,这不是便携式的,双打和......等等也需要更长的时间。
#include <cassert>
#include <iostream>
#include <limits>
union umin {
float mind;
int mini;
} u;
int main()
{
u.mind = std::numeric_limits<float>::max();
std::cout << -u.mind << " " << u.mini << std::endl;
while ( u.mind > 0 ) {
float previous = u.mind;
u.mini -= 1;
std::cout << -u.mind << " " << u.mini << " " << previous - u.mind << std::endl;
assert( previous > u.mind );
}
}