В заголовках stdint.h
(C99), boost / cstdint.hpp и cstdint
(C ++ 0x), среди прочего, есть тип int32_t
.
Существуют ли аналогичные типы с плавающей запятой фиксированного размера? Что-то вроде float32_t
?
c++
c
boost
floating-point
Пьетро
источник
источник
sizeof
оператор. Такой тип был бы полезен, когда алгоритм требует, чтобы он был известного определенного размера.sizeof
использовать для решения проблемы последовательного маршалинга и демаршалинга плавающих типов?Ответы:
Ничего подобного в настоящее время не существует в стандартах C или C ++. Фактически, нет даже гарантии, что
float
вообще будет двоичный формат с плавающей запятой.Некоторые компиляторы гарантируют, что
float
типом будет 32-битный двоичный формат IEEE-754. Некоторые этого не делают. На самомfloat
деле этоsingle
тип IEEE-754 на большинстве невстроенных платформ, хотя применяются обычные предостережения о некоторых компиляторах, оценивающих выражения в более широком формате.Существует рабочая группа, обсуждающая добавление привязок к языку 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
потому что вы обычно хотите использовать оборудование с плавающей запятой, если оно доступно, и не прибегать к программной реализации.источник
long double
Формат на OS X (32-бит и 64-битный Intel) в точности IEEE-754 с двойной расширенный формат хранится в мало-Endian порядке. Ничего особенного в этом нет. Байты 0-7 содержат поле значения, а байты 8 и 9 содержат поля экспоненты и знака.5.0L
имеет значениеa000000000000000
. Его несмещенный показатель степени равен +2, а смещение двойного расширенного показателя составляет3fff
, поэтому смещенный показатель для 5.0L равен4001
. Фактический байтовый образец при хранении в порядке прямого порядка байтов равен00 00 00 00 00 00 00 a0 01 40
, и если вы посмотрите на него как на два 64-битных целых числа с прямым порядком байтов, вы увидите именно то, что вы наблюдали.4001
в little-endian это01 40 00 00 ...
Если ничего больше, младший байт идет первым. Я действительно ожидаю, что последовательностьa0 01 40
появится где-то в номере (если они только выполнили вращение), но я не думаю, что вы объяснили, почемуa0
и01 40
находятся в совершенно разных частях.Если вы считаете, что определение типов, таких как float32_t и float64_t, по каким-либо причинам нецелесообразно, вы, должно быть, слишком привыкли к своей знакомой ОС, компилятору, и не можете смотреть за пределы своего маленького гнезда.
Существует оборудование, которое изначально выполняет 32-битные операции с плавающей запятой IEEE и другое, которое выполняет 64-битные операции. Иногда таким системам даже приходится взаимодействовать друг с другом, и в этом случае чрезвычайно важно знать, является ли double 32-битным или 64-битным на каждой платформе. Если 32-битная платформа будет производить чрезмерные вычисления на основе 64-битных значений из другой, мы можем захотеть выполнить приведение с более низкой точностью в зависимости от требований к времени и скорости.
Мне лично неудобно использовать поплавки и удвоения, если я не знаю точно, сколько битов они находятся на моей платформе. Тем более, если я перенесу их на другую платформу через какой-то канал связи.
источник
В настоящее время предлагается добавить в язык следующие типы:
которые однажды могут быть доступны через
#include <decimal>
.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
источник
decimal24
также нужно упростить такие вещи, как чтение файлов wav с 24-битными образцами!