在C ++中将int设置为Infinity


114

我有一个int a需要等于“无穷大”的东西。这意味着

int b = anyValue;

a>b 永远是真的。

C ++是否有任何功能可以使之成为可能?


您可以只使用floats,它的值表示无穷大。
Xeo

1
@jozefg-好的,这不是用户要Max Value执行的检查,只是语言的实现。
keyboardP

4
@jozefg哈,我想您将实现A *。我近!
Etienne de Martel

2
@jozefg-很有道理。我以为OP要实际执行a>b检查:)
keyboardP

1
@Hikari:不,我是说无法以整数类型表示无穷大。您可以使用重载运算符创建一个类。
基思·汤普森

Answers:


130

整数本质上是有限的。您可以通过将设置aint的最大值来获得最接近的值:

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

这将是2^31 - 1(或2 147 483 647)如果int是32个位宽您的实现。

如果您确实需要无穷大,请使用浮点数类型,例如floatdouble。然后,您可以通过以下方法获得无穷大:

double a = std::numeric_limits<double>::infinity();

37
而且,如果您确实需要infinity作为int,请编写一个包装类,该类将重载比较运算符,并具有一个名为“ is_infinity”的布尔变量。

@WTP考虑到他需要Dijkstra的算法实现,我怀疑这是否必要。但这是最明智的选择。
Etienne de Martel

4
我为未实现Dijkstra算法但将来还需要其他功能的访客添加了评论。:)

看来我们在这里获得了金牌候选人。:)你们俩+1!
Mysticial 2012年

2
请注意,如果使用int解决方案,则必须非常谨慎地进行算术运算:将正数添加到“无穷大”将产生非常意外的结果。
Lambda Fairy

67

整数是有限的,因此遗憾的是您不能将其设置为真正的无限。但是,您可以将其设置为int的最大值,这意味着它将大于或等于任何其他int,即:

a>=b

永远是真的。

您可以这样做

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

这通常等于2,147,483,647

如果确实需要真正的“无限”值,则必须使用双精度或浮点型。然后,您可以简单地执行此操作

float a = std::numeric_limits<float>::infinity();

有关数字限制的更多说明,请参见此处

编码愉快!

注意:如WTP所述,如果绝对有必要使用一个“无限大”的int,则必须为int编写包装类并重载比较运算符,尽管对于大多数项目而言,这并不是必需的。


6
...并且如果要使用数字类型未知的模板max()infinity()该模板,则需要使用+/-infinity()iff std::numeric_limits<T>::has_infinity和其他方法,min()以及max()
Ben Jackson

13

int本质上是有限的;没有任何价值可以满足您的要求。

不过,如果您愿意更改的类型b,则可以使用运算符覆盖:

class infinitytype {};

template<typename T>
bool operator>(const T &, const infinitytype &) {
  return false;
}

template<typename T>
bool operator<(const T &, const infinitytype &) {
  return true;
}

bool operator<(const infinitytype &, const infinitytype &) {
  return false;
}


bool operator>(const infinitytype &, const infinitytype &) {
  return false;
}

// add operator==, operator!=, operator>=, operator<=...

int main() {
  std::cout << ( INT_MAX < infinitytype() ); // true
}

10
或者 ...您可以只使用float和std::numeric_limits<float>::infinity()
Xeo

1
@Xeo,当然,这也是一种选择:)
bdonlan

5

这是将来给我的消息:

只需使用: (unsigned)!((int)0)

通过将所有位分配为1(一),然后将其强制转换为无符号,它在任何机器中创建最大可能的数字

更好

#define INF (unsigned)!((int)0)

然后在代码中使用INF


4
我想你的意思是#define INF ((unsigned) ~0),看这里
保罗·桑德斯


-2

int最小值和最大值

Int -2,147,483,648 / 2,147,483,647 Int 64 -9,223,372,036,854,775,808 / 9,223,372,036,854,775,807

我想您可以将a设置为等于9,223,372,036,854,775,807,但这必须是int64

如果您始终希望a对b感到满意,那么为什么需要对其进行检查?只要将其设置为始终为真


1
这取决于实现方式。C ++中没有“ Int64”(除非您将C ++ 11中的内容计数在内cstdint)。
Etienne de Martel

@Shaun,以进一步解释Etienne所说的内容,stackoverflow.com / questions / 589575 / size-of-int-long-etc 解释了intC ++中的含义和相关类型。
Mike Samuel

我只用过embarcadero c ++ builder,它有一个__int64,我不知道其他c ++也没有。
Shaun07776 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.