Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 4

float на constexpr

03.02.2022, 22:08. Показов 1148. Ответов 8

Студворк — интернет-сервис помощи студентам
Добрый день, появилась необходимость использовать float переменные внутри кода, по стандарту компилятор выносит переменные на секцию ".rdata" для последующего обращения к нему, описал такой пример для описания функций внутри кода
к сожалению он переносит число и так же его оставляет в ".rdata". помогите

C++
1
2
3
4
5
6
7
8
9
10
11
constexpr UINT IntToFloat(float x)
{
    return (UINT&)x;
}
 
constexpr float FloatToInt(UINT x)
{
    return (float&)x;
}
 
#define xf1(n) FloatToInt(IntToFloat(n))

C++
1
2
3
4
5
6
#include <Windows.h>
int main()
{
    printf("%.2f\n", xf1(1.33f));
        return 0;
}
Так же пробывал использование volatile переменных, так же не принесло успеха
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2022, 22:08
Ответы с готовыми решениями:

Присваивание constexpr к non-constexpr
constexpr float pi = 3.14159265; void some_fun() { float angle = 45.0f*(pi/180.0f); std::cout &lt;&lt; angle; } В консоли...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

Не понимает Dictionary<string, (float[][] train, float[][] valid, float[][] test)> DataSet;
Доброго времени суток. Пытаюсь запустить пример по работе с библиотекой. Не понимает конструкцию Dictionary&lt;string, (float train,...

8
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.02.2022, 22:23
Цитата Сообщение от DelMe Посмотреть сообщение
к сожалению он переносит число и так же его оставляет в ".rdata". помогите
Не понятно с чем именно надо помогать.
Чего именно вы хотите добиться от компилятора пока не ясно.
0
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 4
03.02.2022, 22:49  [ТС]
Необходимо заставить компилятор думать что это число UINT с последующей конвертацией на float
т.е чтобы компилятор не вытаскивал переменные с точкой входа на доп секцию а использовал ее например в стеке
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.02.2022, 22:58
Цитата Сообщение от DelMe Посмотреть сообщение
а использовал ее например в стеке
Ну так а на стеке-то значение откуда должно взяться?
Если int-значения по большей части можно закодировать прямо в команду, с float так не выйдет. Чтобы работать с этим значением в регистре или стеке его нужно сначала откуда-то загрузить.
0
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 4
03.02.2022, 23:21  [ТС]
Хорошо, тогда надо обмануть загрузить в виде UINT но работать как с float
с этим как раз должен справится constexpr который переконвентирвует float в UINT и при обращении к переменной просто прочитает constexpr UINT как число float

в полне возможно что есть макросы компиляции при которых компилятор понимает что ему необходимо загрузчить число с плавующей точкой как число и прочитать как float скорее всего это как то влияет на оптиизацию и он игнорирует такого рода код
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.02.2022, 23:58
Цитата Сообщение от DelMe Посмотреть сообщение
с этим как раз должен справится constexpr который переконвентирвует float в UINT
Нет, не должен. Т.е. да, вы технически можете провести какие-то манипуляции с целыми на этапе компиляции, но как только дело дойдет до генерации реального кода, то все будет делаться согласно принятой типизации. constexpr тут ни на что не повлияет, реальное значение на стеке с реальным адресом это уже за пределами того, для чего предназначен constexpr.

Кстати вы определенно должны знать, что современные ABI не работают с float в принципе. Почти везде, где есть взаимодействие с ABI, ваш float в коде превращается в double. Если хотите сохранить совместимость с ABI, то придется это учитывать. Например, в вашем коде функция printf никогда не принимает float, она всегда принимает double, поэтому даже если вы сформируете в регистре или на стеке нужное значение именно как float, то передавать его в таком виде в printf никак не выйдет. Компилятор автоматически это учитывает, и там, где это возможно, число будет сразу сохранено как double.

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

Не понятно зачем вообще все это нужно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,197
08.02.2022, 09:50
Цитата Сообщение от DelMe Посмотреть сообщение
Необходимо заставить компилятор думать что это число UINT с последующей конвертацией на float
т.е чтобы компилятор не вытаскивал переменные с точкой входа на доп секцию а использовал ее например в стеке
На какой платформе вы это делаете?

Система команд с плавающей точкой платформы x86 не содержит команд, принимающих непосредственный операнд. Поэтому как ни вертите, всякий раз, когда вы используете плавающую константу в своем коде, эта плавающая константа фактически превратится в "переменную" в памяти и будет загружаться из памяти.

Цитата Сообщение от DelMe Посмотреть сообщение
число UINT с последующей конвертацией на float
А в системе команд вашей платформы есть команда для такой "конвертации"?

Цитата Сообщение от DelMe Посмотреть сообщение
а использовал ее например в стеке
Так а откуда "на стеке" появится правильное представление? То есть конечно можно предложить вариант, когда компилятор использует обычные целочисленные команды для формирования представления "на стеке", а затем загружает его плавающей командой. Но зачем ему это делать? Чем это лучше, чем просто заранее сформировать готовое плавающее представление в "глобальной" памяти?
0
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 4
08.02.2022, 14:08  [ТС]
Пишу на vc++ 2019, на x64 для windows
и частичное решение проблемы все же появилось я оформил код в таком формате
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
constexpr UINT IntToFloat(float x)
{
    return (UINT&)x;
}
 
constexpr float FloatToInt(UINT x)
{
    return (float&)x;
}
 
float FloatToInt1(UINT x)
{
    printf("Test 0x%X\n", reinterpret_cast<float*>(x));
    return (float&)x;
}
 
#define tx(n) IntToFloat(n)
#define xf1(n) FloatToInt(IntToFloat(n))
 
int main()
{
    //
    printf("0x%X\n", IntToFloat(1.33f));
    printf("%.2f\n\n", xf1(1.33f));
    
    //Скомпилированный вариант с hex ввиде на float (Вполне хороший вариант работы функции, но я все же хотел добится именно такого же результата чтоб сам код разворачивал float как UINT а при использовании брал уже UINT и конвентировал его в float)
    //https://gregstoll.com/~gregstoll/floattohex/
    printf("%.2f\n", FloatToInt(0x3FAA3D71));
    //Тестовый пример преобразования
    printf("%.2f\n", FloatToInt1(1.33f));
 
    return 0;
}
и частично я понял, что нужно заставить переобразовать число с плавующей точкой даже если оно переданно в любом другом но не смог это реализровать на коде т.к при передаче

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

Добавлено через 7 минут
Результат
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
12.02.2022, 00:37
DelMe, хотите, что бы в сгенерированном ассемблерном коде была загрузка константы (immediate) в регистр, с которым можно выполнять операции с плавающей точкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2022, 00:37
Помогаю со студенческими работами здесь

Чем отличаются float преобразования (float)var от float(var)
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

Constexpr
В программе внутри конструкции switch case, встретился с шибкой the value of 'str' is not usable in a constant expression

constexpr
Может кто объяснить как правильно использовать переменную помеченную как constexpr в проекте в нескольких файлах (на примере: эта...

constexpr и union
Добрый день! Подскажите пожалуйста, можно ли использовать constexpr для расчета на этапе компиляции с объединением (union). Мне нужен...

Constexpr функции
В продолжении моего вопроса в этой теме - https://www.cyberforum.ru/cpp-beginners/thread1913846.html Хотел бы уточнить. У нас есть вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru