У заголовках stdint.h
(C99), boost / cstdint.hpp та cstdint
(C ++ 0x) серед іншого є тип int32_t
.
Чи існують подібні типи з плаваючою комою фіксованого розміру? Щось на зразок float32_t
?
У заголовках stdint.h
(C99), boost / cstdint.hpp та cstdint
(C ++ 0x) серед іншого є тип int32_t
.
Чи існують подібні типи з плаваючою комою фіксованого розміру? Щось на зразок float32_t
?
sizeof
оператор. Такий тип був би корисний, коли алгоритм вимагає, щоб він мав відомий конкретний розмір.
sizeof
використати для вирішення проблеми послідовного маршування та демаршування плаваючих типів?
Відповіді:
На сьогодні нічого подібного не існує в стандартах С або С ++. Насправді навіть немає гарантії, що 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
перебуваєте в абсолютно окремих половинах.
Якщо ви вважаєте, що наявність typedefs, таких як float32_t та float64_t, непрактично з будь-яких причин, ви повинні бути занадто звичними до своєї знайомої ОС, компілятора, щоб ви не могли занадто виглядати поза своїм маленьким гніздом.
Існує обладнання, яке спочатку запускає 32-розрядні операції з плаваючою точкою IEEE та інші, що виконують 64-розрядні. Іноді таким системам навіть доводиться спілкуватися між собою, і в цьому випадку надзвичайно важливо знати, чи є дубль 32-бітовим або 64-бітовим на кожній платформі. Якщо 32-розрядна платформа повинна робити надмірні обчислення на основі 64-розрядних значень з іншої, ми можемо захотіти виконати нижчу точність залежно від вимог до часу та швидкості.
Мені особисто незручно користуватися поплавками та дублями, якщо я точно не знаю, скільки бітів вони на моїй платформі. Навіть більше, якщо я хочу перенести їх на іншу платформу через якийсь канал зв'язку.
Зараз пропонується додати до мови такі типи:
decimal32
decimal64
decimal128
який колись може бути доступний через #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html