การตั้งค่า int เป็น Infinity ใน C ++


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
@ ฮิคาริ: ไม่ฉันกำลังบอกว่าไม่มีวิธีแทนค่าอินฟินิตี้ในประเภทจำนวนเต็ม คุณสามารถสร้างคลาสที่มีตัวดำเนินการมากเกินไป
Keith Thompson

คำตอบ:


131

จำนวนเต็มเป็นจำนวน จำกัด โดยเนื้อแท้ ที่อยู่ใกล้คุณจะได้รับคือการตั้งค่าaที่จะint's ค่าสูงสุด:

#include <limits>

// ...

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

ซึ่งจะเป็น2^31 - 1(หรือ2 147 483 647) ถ้าintกว้าง 32 บิตในการใช้งานของคุณ

หากคุณจริงๆต้องอินฟินิตี้ใช้ลอยชนิดจำนวนจุดเหมือนหรือfloat doubleจากนั้นคุณสามารถรับอินฟินิตี้ด้วย:

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

37
และถ้าคุณต้องการอินฟินิตี้เป็นint จริงๆให้เขียนคลาส wrapper ที่โอเวอร์โหลดตัวดำเนินการเปรียบเทียบและมีตัวแปรบูลีนชื่อ "is_infinity"

@WTP เมื่อพิจารณาว่าเขาต้องการสิ่งนั้นสำหรับการใช้อัลกอริทึมของ Dijkstra ฉันสงสัยว่าจะจำเป็น แต่เป็นทางเลือกที่เหมาะสมที่สุด
Etienne de Martel

4
ฉันได้เพิ่มความคิดเห็นสำหรับผู้เยี่ยมชมในอนาคตที่ไม่ได้ใช้อัลกอริทึมของ Dijkstra แต่ต้องการอย่างอื่น :)

ดูเหมือนว่าเราจะได้ผู้สมัครรับเหรียญทองที่นี่ :) +1 ให้ทั้งคู่!
อาถรรพ์

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

หากคุณต้องการค่า "อนันต์" ที่แท้จริงคุณจะต้องใช้ค่า double หรือ float จากนั้นคุณสามารถทำได้

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

สามารถดูคำอธิบายเพิ่มเติมเกี่ยวกับขีด จำกัด ตัวเลขได้ที่นี่

Happy Coding!

หมายเหตุ: ดังที่กล่าวถึง WTP หากจำเป็นอย่างยิ่งที่จะต้องมี int ที่เป็น "infinite" คุณจะต้องเขียนคลาส wrapper สำหรับ 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)

สร้างจำนวนที่มากที่สุดเท่าที่จะเป็นไปได้ในเครื่องใด ๆ โดยกำหนดบิตทั้งหมดเป็น 1s (อัน) จากนั้นส่งไปยังไม่ได้ลงนาม

ดียิ่งขึ้น

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

จากนั้นใช้ INF ในรหัสของคุณ


4
ฉันคิดว่าคุณหมายถึง#define INF ((unsigned) ~0)ให้ดูที่นี่
Paul Sanders


-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

ฉันเดาว่าคุณสามารถตั้งค่าให้เท่ากับ 9,223,372,036,854,775,807 แต่จะต้องเป็น int64

ถ้าคุณต้องการให้ขูดเสมอทำไมคุณต้องตรวจสอบ? เพียงแค่ตั้งค่าให้เป็นจริงเสมอ


1
ขึ้นอยู่กับการนำไปใช้ ไม่มี "Int64" ใน C ++ (เว้นแต่คุณจะนับสิ่งต่างๆใน C ++ 11 cstdint)
Etienne de Martel

@ Shaun เพื่อขยายความเกี่ยวกับสิ่งที่ Etienne กล่าวstackoverflow.com/questions/589575/size-of-int-long-etcจะอธิบายความหมายintและประเภทที่เกี่ยวข้องใน C ++
Mike Samuel

ฉันเคยใช้ตัวสร้าง embarcadero c ++ เท่านั้นและมันมี __int64 ฉันไม่รู้ว่า c ++ อื่น ๆ ก็ไม่มีเช่นกัน
Shaun07776
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.