LINUX.ORG.RU

найти численные значения ограничений в climits

 


0

2

Хочу найти количество битов, используемых для представления мантиссы, максимальные и минимальные значения порядка. Файл climits привел меня на float.h (/usr/lib/gcc/x86_64-linux-gnu/4.6/include/float.h). В этом файле нету численных значений. Для сравнения файл /usr/include/limits.h аналогичную информацию для целочисленных типов содержит

define INT_MAX       2147483647

★★★★★
Ответ на: комментарий от andrew667
#include <iostream>
#include <limits>

using namespace std;

int main()
{
  cout << numeric_limits <double> ::min_exponent << endl;
  cout << numeric_limits <double> ::max_exponent << endl;
  cout << numeric_limits <double> ::digits << endl;
}

он это имеет в виду.

nanoolinux ★★★★
()
Ответ на: комментарий от yoghurt

Пережиток прошлого, т.к. в теге с++

Я код привел намеренно, чтобы было понятно что нужно видеть. Скилла пока немного и читаю отдельные разделы из книги Прата (С++). Там в примере показаны численные значения ограничений типов для чисел с плавающей точкой. Хочу отыскать их в системе

andrew667 ★★★★★
() автор топика

Предложу ещё и такой способ.

template<typename T>
constexpr int mantissa_length(int cur_len = -1, T div = 1)
{
    return (T(1) + div == T(1)) ?
            cur_len :
            mantissa_length<T>(cur_len + 1, div / 2);
}

template<typename T>
constexpr int exponent_length(int cur_len = 1, T div = 2)
{
    return (div * div == div) ?
            cur_len :
            exponent_length<T>(cur_len + 1, div * div);
}


int main()
{
    std::cout << mantissa_length<float>() << ' ' << exponent_length<float>() << std::endl;
    std::cout << mantissa_length<double>() << ' ' << exponent_length<double>() << std::endl;
    std::cout << mantissa_length<__float80>() << ' ' << exponent_length<__float80>() << std::endl;
    std::cout << mantissa_length<long double>() << ' ' << exponent_length<long double>() << std::endl;
    std::cout << mantissa_length<__float128>() << ' ' << exponent_length<__float128>() << std::endl;
    return 0;
}

Micky53
()
Ответ на: комментарий от aedeph_

Разве в C++ у float'а по стандарту обязаны быть мантисса и порядок?

Судя по ссылке http://www.cplusplus.com/reference/cfloat/ и содержимому из книги Стивена Прата думаю быть должны. Здравомыслящие люди же должны были делать. По сути для заголовочных файлов для С++ приведены линки на заголовочные файлы для С, а в них нет инфы.

andrew667 ★★★★★
() автор топика
Последнее исправление: andrew667 (всего исправлений: 2)
Ответ на: комментарий от andrew667

Явно этого не подчёрнуто, в min/max_exponent определение чрезвычайно чёткое без битового представления, хотя в digits упомянута mantissa (один раз на все 1324 страницы драфта стандарта).

Однако я советую обратить внимание на is_bounded, верное значение которого гарантирует бессмысленность корневого вопроса.

aedeph_ ★★
()
Ответ на: комментарий от andrew667

Буква 'c' в 'cfloat' как бы намекает тебе, что этот заголовочный файл относится к стандартной библиотеке С. В С++ следует использовать numeric_limits для нахождения ограничений.

roof ★★
()
Ответ на: комментарий от anonymous

18.3.2.2 Header <limits> synopsis [limits.syn]

namespace std {
template<class T> class numeric_limits;
enum float_round_style;
enum float_denorm_style;
template<> class numeric_limits<bool>;
template<> class numeric_limits<char>;
template<> class numeric_limits<signed char>;
template<> class numeric_limits<unsigned char>;
template<> class numeric_limits<char16_t>;
template<> class numeric_limits<char32_t>;
template<> class numeric_limits<wchar_t>;
template<> class numeric_limits<short>;
template<> class numeric_limits<int>;
template<> class numeric_limits<long>;
template<> class numeric_limits<long long>;
template<> class numeric_limits<unsigned short>;
template<> class numeric_limits<unsigned int>;
template<> class numeric_limits<unsigned long>;
template<> class numeric_limits<unsigned long long>;
template<> class numeric_limits<float>;
template<> class numeric_limits<double>;
template<> class numeric_limits<long double>;
}

18.3.2.3 Class template numeric_limits [numeric.limits]

namespace std {
template<class T> class numeric_limits {
public:
static constexpr bool is_specialized = false;
static constexpr T min() noexcept { return T(); }
static constexpr T max() noexcept { return T(); }
static constexpr T lowest() noexcept { return T(); }
static constexpr int digits = 0;
static constexpr int digits10 = 0;
static constexpr int max_digits10 = 0;
static constexpr bool is_signed = false;
static constexpr bool is_integer = false;
static constexpr bool is_exact = false;
static constexpr int radix = 0;
static constexpr T epsilon() noexcept { return T(); }
static constexpr T round_error() noexcept { return T(); }
static constexpr int min_exponent = 0;
static constexpr int min_exponent10 = 0;
static constexpr int max_exponent = 0;
static constexpr int max_exponent10 = 0;
static constexpr bool has_infinity = false;
static constexpr bool has_quiet_NaN = false;
static constexpr bool has_signaling_NaN = false;
static constexpr float_denorm_style has_denorm = denorm_absent;
static constexpr bool has_denorm_loss = false;
static constexpr T infinity() noexcept { return T(); }
static constexpr T quiet_NaN() noexcept { return T(); }
static constexpr T signaling_NaN() noexcept { return T(); }
static constexpr T denorm_min() noexcept { return T(); }
static constexpr bool is_iec559 = false;
static constexpr bool is_bounded = false;
static constexpr bool is_modulo = false;
static constexpr bool traps = false;
static constexpr bool tinyness_before = false;
static constexpr float_round_style round_style = round_toward_zero;
};
template<class T> class numeric_limits<const T>;
template<class T> class numeric_limits<volatile T>;
template<class T> class numeric_limits<const volatile T>;
}
Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Я спрашивал, не что такое numeric_limits, а что в C++11 добавили нового. Пока что вижу только constexpr везде и noexcept в объявлениях функций. И новую функцию lowest(). Я что-нибудь пропустил?

anonymous
()
Ответ на: комментарий от anonymous

Да, это я погорячился.

Но, например, представление чисел с плавающей точкой с переменным числом бит для мантиссы и порядка представить себе вполне можно.

aedeph_ ★★
()

А зачем ты в файлы лезешь? Напиши программу выводящую нужные тебе значения.

P.S. Зачем тебе понадобились числовые значения констант зависящих от целевой архитектуры?

anonymous
()
Ответ на: комментарий от anonymous

Я тебе кинул полное описание <limits> из финального стандарта С++11. Я хз, что там было раньше, но это - что есть сейчас.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Что тебе не понятно?

Мне до сих пор не понятно зачем был этот пост. И да прости, мой комментарий относился в первую очередь к нему, но возник из-за твоего ответа.

Я не ответил на твой вопрос?

Ответил. Твой ответ можно свести к «Я не знаю».

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.