Anda dapat menggunakan std::numeric_limits
yang ditentukan dalam <limits>
untuk menemukan nilai minimum atau maksimum dari tipe (selama spesialisasi ada untuk tipe). Anda juga dapat menggunakannya untuk mengambil tak terhingga (dan meletakkan -
di depan untuk tak terhingga negatif).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Seperti yang dicatat di komentar, min()
mengembalikan nilai positif serendah mungkin. Dengan kata lain nilai positif yang paling mendekati 0 yang dapat direpresentasikan. Nilai serendah mungkin adalah negatif dari nilai semaksimal mungkin.
Tentu saja ada fungsi std::max_element
dan min_element (ditentukan dalam <algorithm>
) yang mungkin merupakan pilihan yang lebih baik untuk menemukan nilai terbesar atau terkecil dalam sebuah array.
numeric_limits<T>::lowest()
, yang mengembalikan nilai terendah (negatif) yang mungkin untuk tipe untuk memecahkan masalah ini.std::numeric_limits<float>::min()
tidak tidak memberikan nilai positif terkecil yang dapat diwakili; ini memberikan angka floating point presisi tunggal normal terkecil . Ada juga angka di bawah normal antara nol dan angka ini. Secara khusus,std::numeric_limits<float>::min()
memberi1.17549e-38
tetapi float subnormal terkecil yang dapat diwakili adalahnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Anda dapat menggunakan
-FLT_MAX
(atau-DBL_MAX
) untuk bilangan negatif magnitudo maksimum danFLT_MAX
(atauDBL_MAX
) untuk positif. Ini memberi Anda kisaran kemungkinan nilai float (atau double).Anda mungkin tidak ingin menggunakan
FLT_MIN
; itu sesuai dengan bilangan positif magnitudo terkecil yang dapat diwakili dengan float, bukan nilai paling negatif yang dapat diwakili dengan float.FLT_MIN
danFLT_MAX
sesuai denganstd::numeric_limits<float>::min()
danstd::numeric_limits<float>::max()
.sumber
FLT_MIN
] sesuai dengan bilangan positif magnitudo terkecil yang dapat direpresentasikan dengan float" - Ini tidak benar . Itu angka normal terkecil . Ada juga angka di bawah normal.FLT_TRUE_MIN
pelampung terkecil yang sebenarnya, yang sesuai denganstd::numeric_limits<float>::denorm_min()
Tidak ada kebutuhan nyata untuk menginisialisasi ke terkecil / terbesar untuk menemukan terkecil / terbesar dalam array:
Atau, jika Anda melakukannya lebih dari sekali:
Kerugian dari memberikan kode sampel - Saya melihat orang lain telah menyarankan ide yang sama.
Perhatikan bahwa sementara standar memiliki min_element dan max_element, menggunakan ini akan memerlukan pemindaian melalui data dua kali, yang bisa menjadi masalah jika lariknya besar sama sekali. Standar terbaru telah mengatasi hal ini dengan menambahkan a
std::minmax_element
, yang melakukan hal yang sama seperti difind_extrema
atas (temukan elemen minimum dan maksimum dalam koleksi dalam sekali jalan).Sunting: Mengatasi masalah menemukan nilai bukan nol terkecil dalam larik unsigned: amati bahwa nilai unsigned "membungkus" ketika mencapai nilai ekstrem. Untuk mencari nilai bukan nol terkecil, kita dapat mengurangi satu dari masing-masing untuk perbandingan. Setiap nilai nol akan "membungkus" ke nilai terbesar yang mungkin untuk jenis tersebut, tetapi hubungan antara nilai lain akan dipertahankan. Setelah kami selesai, kami jelas menambahkan satu kembali ke nilai yang kami temukan.
Perhatikan bahwa ini masih menggunakan elemen pertama untuk nilai awal, tetapi kami masih tidak memerlukan kode "kasus khusus" - karena kode tersebut akan menghasilkan nilai terbesar yang mungkin, nilai bukan nol apa pun akan dibandingkan sebagai lebih kecil. Hasilnya akan menjadi nilai bukan nol terkecil, atau 0 jika dan hanya jika vektor tidak berisi nilai bukan nol.
sumber
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Untuk menemukan nilai minimum array secara manual, Anda tidak perlu mengetahui nilai minimum float:
Dan kode serupa untuk nilai maksimum.
sumber
Bolehkah saya menyarankan agar Anda menginisialisasi variabel "maks dan min sejauh ini" bukan hingga tak terbatas, tetapi ke angka pertama dalam larik?
sumber