В stdint.h
(C99), boost/cstdint.hpp и cstdint
(С++ 0x) заголовки есть, среди прочих, тип int32_t
.
Существуют ли аналогичные типы с плавающей запятой с фиксированным размером? Что-то вроде float32_t
?
В stdint.h
(C99), boost/cstdint.hpp и cstdint
(С++ 0x) заголовки есть, среди прочих, тип int32_t
.
Существуют ли аналогичные типы с плавающей запятой с фиксированным размером? Что-то вроде float32_t
?
В настоящее время в стандартах C или С++ ничего подобного не существует. На самом деле даже нет гарантии, что float
будет бинарным форматом с плавающей запятой вообще.
Некоторые компиляторы гарантируют, что тип float
будет 32-битным двоичным форматом IEEE-754. Некоторые этого не делают. На самом деле, float
на самом деле является типом IEEE-754 single
на большинстве незапланированных платформ, хотя применяются обычные предостережения о некоторых компиляторах, оценивающих выражения в более широком формате.
Существует рабочая группа, обсуждающая добавление привязок языка C к пересмотру IEEE-754 2008 года, в котором может быть рекомендовано добавить такой тип typedef. Если бы это было добавлено в 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
как таковой, потому что вы обычно хотите использовать аппаратное обеспечение с плавающей запятой, если оно доступно, и не отказываться от реализации программного обеспечения.
Если вы считаете, что typedefs, такие как float32_t и float64_t, непрактичны по каким-либо причинам, вы должны слишком привыкнуть к своей знакомой ОС, компилятору, что вы не можете слишком смотреть за пределы своего маленького гнезда.
Существуют аппаратные средства, которые запускают 32-разрядные операции с плавающей точкой IEEE и другие, которые выполняют 64-разрядные операции. Иногда такие системы даже должны разговаривать друг с другом, и в этом случае чрезвычайно важно знать, является ли двойной бит 32 бит или 64 бит на каждой платформе. Если 32-битная платформа должна была делать чрезмерные вычисления на базе по 64-битным значениям от другой, мы можем захотеть использовать ее с меньшей точностью в зависимости от требований времени и скорости.
Я лично чувствую себя некомфортно, используя поплавки и удваивает, если я точно не знаю, сколько бит они находятся на моей платформе. Тем более, если я хочу перенести их на другую платформу по каналу связи.
В настоящее время существует предложение добавить в язык следующие типы:
decimal32
decimal64
decimal128
который в один прекрасный день может быть доступен через #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html