Есть ли способ инициализировать переменную типа float с шестнадцатеричным числом? то, что я хочу сделать, это сказать, что у меня есть одноточное представление для 4
, которое равно 0x40800000
в шестнадцатеричном формате. Я хочу сделать что-то вроде float a = 0x40800000
, и в этом случае он принимает шестнадцатеричное значение как целое. Что я могу сделать, чтобы он рассматривался как число с плавающей запятой?Обработка шестнадцатеричного значения как значения одиночной точности или двойной точности
ответ
Один из вариантов заключается в использовании type punning через a union. Это defined behaviour in C since C99 (ранее это была реализация определена).
union {
float f;
uint32_t u;
} un;
un.u = 0x40800000;
float a = un.f;
Как помечено это C++, вы можете также использовать reinterpret_cast
.
uint32_t u = 0x40800000;
float a = *reinterpret_cast<float*>(&u);
Перед выполнением любой из них, вы должны подтвердить, что они того же размера:
assert(sizeof(float) == sizeof(uint32_t));
Как вы используете 'reinterpret_cast' здесь? – TonyK
@TonyK Он говорит, что не используйте C-style casts в ссылке, используйте 'reinterpret_cast'. –
@JonathanMee: Может быть, он говорит это (например, 'f = * reinterpret_cast
Вы можете сделать это, если ввести переменную временного целого типа, приведение его в плавающее точечный тип и разыгрывать его. Вы должны быть осторожны с размерами задействованных типов и знать, что они могут измениться. С моим компилятором, например, это работает:
unsigned i = 0x40800000;
float a = *(float*)&i;
printf("%f\n", a);
// output 4.00000
Хотя это может сработать, я уверен, что это неопределенное поведение по спецификации, поэтому остерегайтесь драконов и всего этого. –
@SimonByrne Это идентично использованию 'union' при условии, что' sizeof (unsigned) == sizeof (float) ', поэтому, возможно, там должен быть' assert'. –
@JonathanMee Нет, одно не определено поведение на C, а другое - нет. Это означает, что компилятор может и будет оптимизировать, полагая, что '* (float *) & i' не происходит. Компиляторы C и C++ перестали быть по очереди переводчиками из источника в сборку около пятнадцати лет назад (http://www.drdobbs.com/cpp/type-based-alias-analysis/184404273) –
Я не знаю, как вы получаете ваше значение «0x40800000».
Если это подходит в качестве int
вы можете просто сделать:
const auto foo = 0x40800000;
auto a = *(float*)&foo;
Если это приходит в виде строки, вы можете сделать:
float a;
sscanf("0x40800000", "0x%x", &a);
0x40800000 - это то, что двоичное представление в памяти 4 выглядит как в формате IEEE 754. См. [This] (http://www.h-schmidt.net/FloatConverter/IEEE754.html) для интерактивного примера. Если, например, вы писали низкоуровневый, ориентированный на архитектуру, оптимизированный по циклу десериализатор для 32-разрядного IEEE754, тогда вы могли бы сделать то, что вы предлагаете в своем первом примере. –
@AndyBrown My, наряду со всеми другими текущими ответами, просто предположим, что 'int' имеет тот же размер, что и' float', * и *, что 'float', представленный« 0x40800000 », имеет тот же формат, который используется текущая архитектура. Пока оба они верны, нет необходимости писать десериализатор. Достаточно простого «союза» или литья. –
- 1. Значения двойной точности
- 2. Любые причины предпочтительности одиночной точности для двойной точности данных?
- 3. Формат значения двойной точности в Postgresql
- 4. Отдел двойной точности
- 5. Увеличение значений двойной точности
- 6. Преобразование точности двойной в строку
- 7. двойной точности Теорье
- 8. Формат двойной точности в PostgreSQL
- 9. Java двойной точности
- 10. MATLAB двойной точности спутанность
- 11. Использование двойной точности в запросе
- 12. двойной точности в C
- 13. Postgres двойной точности
- 14. двойной точности - пау()
- 15. Fortran двойной точности
- 16. Как сделать скользящее окно значением двойной точности?
- 17. Графит - округлые значения/заданные значения точности
- 18. Обработка десятичной точности в Mysql или PHP
- 19. Как преодолеть неточность двойной точности?
- 20. двойной точности проблемы на .NET
- 21. значения отрицательной точности в ostream
- 22. чтение значения ячейки сохранения точности
- 23. Ошибки вычисления значения двойной точности на процессорах MediaTek
- 24. Преобразование длинных Int секунд значения с плавающей точкой двойной точности
- 25. Изменение двойной точности файла данных
- 26. «Sprintf»: двойной точности в C
- 27. Java двойной потери точности вычисления
- 28. GLSL двойной точности буфера вершин
- 29. Неверный двойной расчет точности Delphi
- 30. Порядок величины для двойной точности
'плыви = 4' ... –
@KarolyHorvath номер i get будет в шестнадцатеричном формате, представленном в формате с плавающей запятой с одиночной/двойной точностью. – Gautam
Поместите целое число вместе с поплавком в объединение. –