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

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

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

Ответ 1

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

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

Существует рабочая группа, обсуждающая добавление привязок языка C к пересмотру IEEE-754 2008 года, в котором может быть рекомендовано добавить такой тип typedef. Если бы это было добавлено в C, я ожидаю, что стандарт С++ последует этому примеру... в конце концов.

Ответ 2

Если вы хотите узнать, является ли ваш 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 как таковой, потому что вы обычно хотите использовать аппаратное обеспечение с плавающей запятой, если оно доступно, и не отказываться от реализации программного обеспечения.

Ответ 3

Если вы считаете, что typedefs, такие как float32_t и float64_t, непрактичны по каким-либо причинам, вы должны слишком привыкнуть к своей знакомой ОС, компилятору, что вы не можете слишком смотреть за пределы своего маленького гнезда.

Существуют аппаратные средства, которые запускают 32-разрядные операции с плавающей точкой IEEE и другие, которые выполняют 64-разрядные операции. Иногда такие системы даже должны разговаривать друг с другом, и в этом случае чрезвычайно важно знать, является ли двойной бит 32 бит или 64 бит на каждой платформе. Если 32-битная платформа должна была делать чрезмерные вычисления на базе по 64-битным значениям от другой, мы можем захотеть использовать ее с меньшей точностью в зависимости от требований времени и скорости.

Я лично чувствую себя некомфортно, используя поплавки и удваивает, если я точно не знаю, сколько бит они находятся на моей платформе. Тем более, если я хочу перенести их на другую платформу по каналу связи.

Ответ 4

В настоящее время существует предложение добавить в язык следующие типы:

decimal32
decimal64
decimal128

который в один прекрасный день может быть доступен через #include <decimal>.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html