Проблема в том, что вы пытаетесь преобразовать число с плавающей точкой в указатель.
C не указывает ничего о формате указателя.Это потому, что C пытается абстрагировать все возможные архитектуры, а некоторые архитектуры имеют весьма необычные способы представления указателей.Например, на машинах lisp места памяти, следовательно, указатели представлены в сегменте: смещение).То же самое и в гарвардских архитектурах - это зона кода зоны данных и способы, которыми указатель кодирует эти разные зоны.C делает только различие между указателем на функцию и указателем на объект, но ничего не говорит о значении каждого бита объекта указателя.
Тот факт, что целое число на вашем компьютере хорошо преобразовано, является просто случайностью.Если ваш компьютер имел 64 адреса шины и целые числа на 32, а возвращенный указатель имеет некоторый смысл и кажется «равным» целому числу, это означает только то, что архитектура может иметь такое же представление целочисленных значений, что и для указателей.
Теперь в вашем коде float преобразуется в указатель, а из указателя обратно в float.Представление с плавающей точкой определяется как знак / экспонента / мантисса, но представление указателя не определено, и может произойти неопределенное поведение.