Типы с плавающей запятой фиксированного размера
на stdint.h (C99),boost / cstdint.ГЭС и cstdint (C++0x) заголовки есть, среди прочего, тип int32_t.
существуют ли подобные типы с плавающей запятой фиксированного размера? Что-то вроде float32_t?
4 ответа:
ничего подобного не существует в стандартах C или C++ в настоящее время. На самом деле, нет даже гарантии, что
floatбудет двоичный формат с плавающей точкой на всех.некоторые компиляторы гарантируют, что
floatтип будет IEEE-754 32-битный двоичный формат. Некоторые-нет. На самом деле,floatна самом деле IEEE-754singleтипа большинство не встроенные платформы, хотя обычные предостережения о некоторых компиляторах, оценивающих выражения в более широком формате применять.существует рабочая группа, обсуждающая добавление Привязок языка C для пересмотра IEEE-754 2008 года, которая могла бы рассмотреть вопрос о том, чтобы рекомендовать добавить такой typedef. Если бы это было добавлено к C, я ожидаю, что стандарт C++ последует этому примеру... в итоге.
если вы хотите знать, является ли ваш
floatявляется 32-разрядным типом IEEE, проверьтеstd::numeric_limits<float>::is_iec559. Это константа времени компиляции, а не функция.если вы хотите быть более пуленепробиваемым, также проверьте
std::numeric_limits<float>::digitsчтобы убедиться, что они не украдкой используют стандарт IEEE двойной точности дляfloat. Это должен быть 24.когда дело доходит до
long double, это более важно, чтобы проверитьdigitsпотому что есть несколько форматов IEEE, которые могут быть разумно: 128 бит (цифры = 113) или 80 бит (цифры = 64).было бы непрактично иметь
float32_tкак таковой, потому что вы обычно хотите использовать аппаратное обеспечение с плавающей запятой, если оно доступно, и не возвращаться к программной реализации.
Если вы считаете, что такие типы, как float32_t и float64_t, непрактичны по каким-либо причинам, вы должны быть слишком привыкли к своей знакомой ОС, компилятору, что вы не можете слишком смотреть за пределы своего маленького гнезда.
существует оборудование, которое изначально выполняет 32-разрядные операции IEEE с плавающей запятой и другие, которые делают 64-разрядные. Иногда такие системы даже должны говорить друг с другом, и в этом случае чрезвычайно важно знать, является ли двойной 32-бит или 64-бит на каждой платформе. Если 32-битная платформа должна была делать чрезмерные вычисления на основе 64-битных значений из другого, мы можем захотеть привести к более низкой точности в зависимости от требований к времени и скорости.
Я лично чувствую себя некомфортно, используя поплавки и удваивается, если я точно не знаю, сколько бит они находятся на моем platfrom. Тем более если я хочу перенести их на другую платформу по какому-то каналу связи.
в настоящее время есть предложение добавить в язык следующие типы:
decimal32 decimal64 decimal128который однажды может быть доступен через
#include <decimal>.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html