Типы с плавающей запятой фиксированного размера


на stdint.h (C99),boost / cstdint.ГЭС и cstdint (C++0x) заголовки есть, среди прочего, тип int32_t.

существуют ли подобные типы с плавающей запятой фиксированного размера? Что-то вроде float32_t?

4 66

4 ответа:

ничего подобного не существует в стандартах C или C++ в настоящее время. На самом деле, нет даже гарантии, что float будет двоичный формат с плавающей точкой на всех.

некоторые компиляторы гарантируют, что float тип будет IEEE-754 32-битный двоичный формат. Некоторые-нет. На самом деле,float на самом деле IEEE-754 single типа большинство не встроенные платформы, хотя обычные предостережения о некоторых компиляторах, оценивающих выражения в более широком формате применять.

существует рабочая группа, обсуждающая добавление Привязок языка 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