Типы с плавающей запятой фиксированного размера
на 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