2012-01-12 2 views
2

Я пишу несколько функций, которые преобразуют float/double в неподвижную точку и обратно. Кто-нибудь знает, как наилучшим образом определить количество бит, используемых для экспоненциальной части float или double? Я надеялся использовать что-то из std :: numeric_limits, но не повезло.Сколько бит используется для экспоненты

Является ли часть экспоненты определенной стандартом C++ или является ее компилятором/машиной конкретной? Или он может меняться во время выполнения?

ответ

6

Если float на этой платформе закодирован в IEC-559 (a.k.a. IEEE 754 в Соединенных Штатах Америки), то он всегда будет 8 бит. Если double этой платформы закодирован с IEC-559 (или независимо от 64-разрядной версии), тогда она всегда будет 11. Если нет, то вы даже не можете предположить, что она хранит экспонента.

Хотя стандарт не определяет, в каком формате чисел с плавающей точкой должны быть сохранены, в C++ 11 (и C++ 03?), Вы можете проверить, если float или double соответствует IEC-559 с помощью numeric_limits<T>::is_iec559 (где T тип с плавающей точкой):

#include <limits> 

cout << "float is IEC-559? " << numeric_limits<float>::is_iec559 << endl 
    << "double is IEC-559? " << numeric_limits<double>::is_iec559 << endl; 
0

Читайте на IEEE-754. Размеры экспоненты для float и double должны быть соответственно 8 и 11 бит.

1

Что отсутствует в numeric_limits <> :: {min_exponent, max_exponent}? (Они вынуждены давать ответ на нормализованные номера, если это вас не устраивает, объединяйтесь с denorm и digits).

0

Характеристики чисел с плавающей запятой зависят от архитектуры машины. Он не меняется во время выполнения. Посмотрите на заголовок < cfloat> вашего компилятора, он должен иметь детали.

Но вы также можете погрузиться в машину самостоятельно: Книга Численные рецепты на языке C от W.H. Press et al. содержит программу с именем machar.c в главе 20.1 (Меньше-числовые алгоритмы) для обнаружения возможностей плавающей запятой машины, не предполагая ничего из стандартных заголовков библиотек. Он также доступен online.