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

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

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

82
задан Whymarrh 30 April 2017 в 01:46
поделиться

2 ответа

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

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

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

42
ответ дан 24 November 2019 в 09:20
поделиться

Если вы хотите узнать, является ли ваш float 32-битным типом IEEE, проверьте std :: numeric_limits :: is_iec559 . Это константа времени компиляции, а не функция.

Если вы хотите быть более надежным, также проверьте std :: numeric_limits :: digits , чтобы убедиться, что они не скрытно используют стандарт двойной точности IEEE для float . Это должно быть 24.

Когда дело доходит до long double , более важно проверять цифр , потому что есть пара форматов IEEE, которые могут быть разумными: 128 бит (цифры = 113) или 80 бит (цифры = 64).

Было бы непрактично иметь float32_t как таковой, потому что вы обычно хотите использовать оборудование с плавающей запятой, если оно доступно, и не прибегать к программной реализации.

28
ответ дан 24 November 2019 в 09:20
поделиться