вот довольно простой вопрос (я думаю), существует ли метод библиотеки STL, который обеспечивает предел типа переменной (например, целое число)? Я знаю, что эти пределы расходятся в различных компьютерах, но должен быть способ получить их через метод, правильно?
Кроме того, было бы действительно трудно записать метод для вычисления предела типа переменной?
Мне просто любопытно!:)
Спасибо ;).
Используйте std::numeric_limits
:
// numeric_limits example
// from the page I linked
#include <iostream>
#include <limits>
using namespace std;
int main () {
cout << boolalpha;
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
return 0;
}
Я вижу, что "правильный" ответ уже дан: Используйте <ограничения>
и позвольте магии произойти. Я нахожу этот ответ неудовлетворительным, так как вопрос стоит так:
Неужели будет действительно сложно написать метод вычисления предела типа переменной?
Ответ: легко для целочисленных типов, трудно для типов с плавающей точкой. Есть 3 основных типа алгоритмов, которые вам понадобятся. знаковый, беззнаковый и с плавающей точкой. Каждый из них имеет свой алгоритм получения min и max, а реальный код включает в себя некоторое скручивание, и в случае с плавающей точкой, вам придется зацикливаться, если у вас нет известного целочисленного типа, который имеет тот же размер, что и тип float.
Итак, вот оно.
Беззнаковый - это просто. min - это когда все биты равны 0, max - когда все биты равны 1. Для signed, min - это когда знаковый бит установлен, но все остальные биты - нули, max - когда все биты, кроме знакового бита, установлены. Существует потенциально много способов представления чисел с плавающей точкой, но для тех, кто использует двоичное (а не базовое 10) представление с плавающей точкой, почти все используют представления IEEE.
Для IEEE floats наименьшее положительное значение с плавающей точкой - это когда младший бит экспоненты равен 1, а все остальные биты - 0. Самое большое отрицательное значение с плавающей точкой - это бит, обратный этому. Однако, без целочисленного типа, который, как известно, имеет тот же размер, что и данный тип с плавающей точкой, нет никакого другого способа манипулировать битами, кроме как выполнять цикл. Если у вас есть целочисленный тип, который, как вы знаете, имеет тот же размер, что и ваш тип с плавающей точкой, вы можете сделать это как единственную операцию.
const float_type get_float_type_smallest() {
const float_type float_1 = (float_type)1.0;
const float_type float_2 = (float_type)0.5;
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ((byte*)&float_1)[ii] ^ ((byte*)&float_2)[ii];
return u.fl;
}
const float_type get_float_type_largest() {
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
u.fl = get_float_type_smallest();
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ~u.ab[ii];
return -u.fl; // Need to re-invert the sign bit.
}
(относящиеся к Си, но я думаю, что это относится и к Си++)
Можно также попробовать "enquire", который представляет собой скрипт, способный воссоздать limits.h для вашего компилятора. Цитата с домашней страницы проектора:
Это программа, которая определяет много свойства компилятора Си и машина, на которой она работает, например минимальный и максимальный [без] подписанного чар/мин/долго, многие свойства float/ [long] double, и т.д.
В качестве опции он производит ANSI C float.h и limits.h файлы.
В качестве дополнительной опции, он даже проверяет что компилятор читает заголовок файлы правильно.
Это хороший тест для компиляторов, так как он упражняет их со многими предельные значения, такие как минимум и максимальные числа с плавающей точкой.
#include <limits>
std::numeric_limits<type>::max() // min() etc