Menyetel int ke Infinity di C ++


114

Saya memiliki int akebutuhan yang harus sama dengan "tak terbatas". Artinya jika

int b = anyValue;

a>b selalu benar.

Apakah ada fitur C ++ yang memungkinkan hal ini?


Anda bisa menggunakan floats, yang memiliki nilai yang mewakili tak terhingga.
Xeo

1
@jozefg - Oke, jadi ini bukan pemeriksaan yang dicari pengguna, hanya Max Valueimplementasi bahasanya.
keyboardP

4
@jozefg Ha, saya pikir Anda akan menerapkan A *. Saya sangat dekat!
Etienne de Martel

2
@jozefg - Itu masuk akal. Saya pikir OP ingin benar-benar melakukan a>bpemeriksaan :)
keyboardP

1
@ Hikari: Tidak, saya katakan bahwa tidak ada cara untuk merepresentasikan infinity dalam tipe integer. Anda dapat membuat kelas dengan operator yang kelebihan beban.
Keith Thompson

Jawaban:


130

Integer secara inheren terbatas. Yang paling dekat yang bisa Anda dapatkan adalah dengan menyetel ake intnilai maksimum:

#include <limits>

// ...

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

Yang akan menjadi 2^31 - 1(atau 2 147 483 647) jika int32 bit lebar pada implementasi Anda.

Jika Anda benar - benar membutuhkan angka tak terbatas, gunakan jenis angka titik mengambang, seperti floatatau double. Anda kemudian bisa mendapatkan infinity dengan:

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

37
Dan jika Anda benar - benar membutuhkan infinity sebagai int , tulis kelas pembungkus yang membebani operator perbandingan dan memiliki variabel boolean bernama "is_infinity".

@WTP Mengingat dia membutuhkan itu untuk implementasi algoritma Dijkstra, saya ragu itu akan diperlukan. Tapi itu pilihan yang paling masuk akal.
Etienne de Martel

4
Saya menambahkan komentar untuk pengunjung mendatang yang tidak menerapkan algoritma Dijkstra, tetapi membutuhkannya untuk hal lain. :)

Sepertinya kita punya calon lencana emas di sini. :) +1 untuk kalian berdua!
Mysticial

2
Perhatikan bahwa jika Anda menggunakan intsolusi, Anda harus sangat berhati-hati dengan aritmatika: menambahkan angka positif ke "tak terhingga" akan menghasilkan hasil yang sangat tidak terduga.
Lambda Fairy

67

Bilangan bulat itu terbatas, jadi sayangnya Anda tidak bisa menyetelnya menjadi tak terhingga. Bagaimanapun Anda dapat mengaturnya ke nilai maksimal dari sebuah int, ini berarti nilainya akan lebih besar atau sama dengan int lainnya, yaitu:

a>=b

selalu benar.

Anda akan melakukan ini dengan

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Ini biasanya akan sama dengan 2.147.483.647

Jika Anda benar-benar membutuhkan nilai "tak terbatas" yang sebenarnya, Anda harus menggunakan double atau float. Kemudian Anda dapat melakukannya

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

Penjelasan tambahan tentang batas numerik dapat ditemukan di sini

Selamat Coding!

Catatan: Seperti yang disebutkan WTP, jika benar-benar diperlukan untuk memiliki int yang "tak terbatas" Anda harus menulis kelas pembungkus untuk int dan membebani operator pembanding, meskipun ini mungkin tidak diperlukan untuk sebagian besar proyek.


6
... dan jika Anda ingin menggunakan max()atau infinity()dalam template di mana tipe numeriknya tidak diketahui, Anda harus menggunakan +/-infinity()iff std::numeric_limits<T>::has_infinitydan sebaliknya min()danmax()
Ben Jackson

13

intsecara inheren terbatas; tidak ada nilai yang memenuhi kebutuhan Anda.

Jika Anda ingin mengubah jenis b, Anda dapat melakukan ini dengan penggantian operator:

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
Atau ... Anda bisa menggunakan float dan std::numeric_limits<float>::infinity().
Xeo

1
@Xeo, tentu, itu juga pilihan :)
bdonlan

5

Ini adalah pesan untuk saya di masa depan:

Gunakan saja: (unsigned)!((int)0)

Ini menciptakan kemungkinan nomor terbesar di mesin apa pun dengan menetapkan semua bit ke 1s (satu) dan kemudian melemparkannya ke unsigned

Bahkan lebih baik

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

Dan kemudian gunakan saja INF di kode Anda


4
Saya pikir maksud Anda #define INF ((unsigned) ~0), lihat di sini .
Paul Sanders


-2

int min dan nilai maks

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

saya kira Anda bisa mengatur menjadi sama dengan 9.223.372.036.854.775.807 tetapi itu harus menjadi int64

Jika Anda selalu ingin menjadi parutan itu mengapa Anda perlu memeriksanya? setel agar selalu benar


1
Itu tergantung implementasinya. Tidak ada "Int64" di C ++ (kecuali Anda menghitung barang di C ++ 11 cstdint).
Etienne de Martel

@Shaun, untuk memperluas apa yang dikatakan Etienne, stackoverflow.com/questions/589575/size-of-int-long-etc menjelaskan arti intdan jenis terkait dalam C ++.
Mike Samuel

Saya hanya pernah menggunakan embarcadero c ++ builder dan memiliki __int64, saya tidak tahu c ++ lain juga tidak memilikinya.
Shaun07776
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.