Типы с плавающей запятой фиксированного размера - PullRequest
78 голосов
/ 26 марта 2010

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

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

Ответы [ 4 ]

42 голосов
/ 26 марта 2010

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

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

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

28 голосов
/ 26 марта 2010

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

15 голосов
/ 21 марта 2014

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

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

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

3 голосов
/ 14 января 2016

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

decimal32
decimal64
decimal128

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

http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2014 / n3871.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...