2010-03-26 4 views
59

В заголовках stdint.h (C99), boost/cstdint.hpp и cstdint (C++ 0x) есть, среди прочих, тип int32_t.Типы с плавающей запятой с фиксированным числом

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

+4

Зачем вам это нужно? – AraK

+1

Pietro, похоже, что вы не можете понять, как работают поплавки. –

+30

Вам нужно что-то подобное, когда у вас есть структура данных с плавающей точкой, и вы также хотите точно знать, что это за размер. – mob

ответ

37

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

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

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

+0

Я надеюсь, что рабочая группа свяжет C/C++ с IEEE-754. Поэтому, если вы хотите переносить, вы можете получить его более легко, и если вам это не понадобится, вы можете продолжать использовать старые зависимые от платформы типы. – Pietro

+2

Независимо от IEEE-754 или нет, это все равно не будет препятствовать проблемам с переносимостью endian. –

+1

@Pietro: изменение языка не повлияет на вашу аппаратную совместимость, это только помешает некоторому оборудованию соответствовать требованиям. Как IEEE FP гарантирует мобильность? – Potatoswatter

22

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

+0

Формат 'long double' на OS X (как 32-разрядная, так и 64-разрядная Intel) - это в точности двойной расширенный формат IEEE-754, хранящийся в порядке порядка юнитов. Ничего не фанки об этом вообще. Байты 0-7 удерживают значение значимого поля, а байты 8 и 9 удерживают поля экспоненты и знака. –

+0

@ Stephen: это хорошая новость: v). Согласен ли это с номерами, которые я опубликовал? – Potatoswatter

+1

Помните, что двойной расширенный (в отличие от других 754 форматов) имеет явный старший значащий бит, поэтому '5.0L' имеет значение' a000000000000000'. Его несмещенный показатель равен +2, а двойной расширенный коэффициент экспоненты равен '3fff', поэтому смещенный показатель для 5.0L -' 4001'.Фактический байт-шаблон при сохранении в порядке малых порядков составляет 0000 00 00 00 00 00 a0 01 40', и если вы считаете, что в качестве двух малозначных 64-битных целых чисел вы увидите точно, что вы наблюдали. –

13

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

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

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

+0

«Я лично чувствую себя некомфортно, используя поплавки и парные разряды, если я точно не знаю, сколько бит они находятся на моем платеже. Тем более, если я хочу передать их на другую платформу по каналу связи». - Вы имеете в виду, что используете текстовые форматы? При этом существует недостаток размера файла: 32 float нуждается в 4 байтах; они в текстовой форме могут представлять только четырехзначное число ... – Pietro

2

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

decimal32 
decimal64 
decimal128 

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

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

+1

Конечно, десятичные типы не являются типами с плавающей точкой IEEE 754. –

Смежные вопросы