Когда я компилирую код C с помощью своей кросс-инструментальной цепочки, компоновщик распечатывает страницы с предупреждениями о том, что мой исполняемый файл использует жесткие числа с плавающей запятой, а моя библиотека libc использует мягкие числа с плавающей запятой. Какая разница?
98
Ответы:
Жесткие числа с плавающей запятой используют встроенный блок с плавающей запятой. Мягкие поплавки имитируют их в программном обеспечении. Разница в скорости. Странно видеть, что оба они используются в одной целевой архитектуре, поскольку чип либо имеет FPU, либо его нет. Вы можете включить мягкую плавающую точку в GCC с помощью -msoft-float. Вы можете перекомпилировать вашу libc для использования аппаратной с плавающей запятой, если вы ее используете.
источник
Есть три способа выполнить арифметику с плавающей запятой:
источник
Строго говоря, все эти ответы мне кажутся неправильными.
Вики Debian VFP содержит информацию о трех вариантах
-mfloat-abi
:soft
- это чистый софтsoftfp
- это поддерживает аппаратный FPU, но ABI программно совместим.hard
- ABI использует регистры с плавающей запятой или VFP .Ошибка компоновщика (загрузчика) связана с тем, что у вас есть общая библиотека, которая будет передавать значения с плавающей запятой в целочисленные регистры. Вы все еще можете скомпилировать свой код с помощью a
-mfpu=vfp
и т. Д., Но вы должны использовать его-mfloat-abi=softfp
так, чтобы, если libc требуется float, он передавался способом, понятным библиотеке.Ядро Linux может поддерживать эмуляцию инструкций VFP. Очевидно, что
-mfpu=none
в этом случае лучше выполнить компиляцию с использованием компилятора, генерирующего код напрямую, а не полагаться на какую-либо эмуляцию ядра Linux. Однако я не верю, что ошибка OP действительно связана с этой проблемой. Он отдельный, и с ним также нужно работать вместе с-mfloat-abi
.Совместно используемая библиотека Armv5 с процессором ArmV7 - противоположность этой; Libc было трудно поплавком , но применение только мягкое . У него есть несколько способов обойти эту проблему, но перекомпиляция с правильными параметрами всегда является самым простым.
Другая проблема заключается в том, что ядро Linux должно поддерживать задачи VFP (или любую другую имеющуюся плавающую точку ARM) для сохранения / восстановления регистров при переключении контекста.
источник
Похоже, ваша библиотека libc была создана для программных операций с плавающей запятой, в то время как ваш exe был скомпилирован с учетом аппаратной поддержки плавающей запятой. В краткосрочной перспективе вы можете использовать мягкие числа с плавающей запятой в качестве флага компилятора. (если вы используете gcc, я думаю, что это -msoft-float)
В долгосрочной перспективе, если процессор вашей цели имеет аппаратную поддержку операций с плавающей запятой, вы, как правило, захотите создать или найти кросс-инструментальную цепочку с аппаратным поплавком, включенным для скорости. Некоторые семейства процессоров имеют варианты моделей, некоторые с аппаратной поддержкой, а некоторые без нее. Так, например, просто сказать, что ваш процессор ARM, недостаточно, чтобы знать, есть ли у вас аппаратная поддержка с плавающей запятой.
источник
Вычисления могут выполняться аппаратными средствами с плавающей запятой или программным обеспечением на основе целочисленной арифметики.
Аппаратно это сделать намного быстрее, но многие микроконтроллеры не имеют аппаратного обеспечения с плавающей запятой. В этом случае вы можете либо избегать использования чисел с плавающей запятой (обычно это лучший вариант), либо полагаться на программную реализацию, которая будет частью библиотеки C.
В некоторых семействах контроллеров, например ARM, оборудование с плавающей запятой присутствует в некоторых моделях семейства, но отсутствует в других, поэтому gcc для этих семейств поддерживает оба. Кажется, ваша проблема в том, что вы перепутали два варианта.
источник