Каково различие между трудными и мягкими числами с плавающей точкой?

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

95
задан rrhartjr 29 April 2013 в 19:24
поделиться

4 ответа

Жесткие поплавки используют встроенный в чип блок вычислений с плавающей запятой. Мягкие поплавки эмулируют его в программном обеспечении. Разница заключается в скорости. Странно видеть оба варианта на одной и той же целевой архитектуре, поскольку чип либо имеет FPU, либо нет. Вы можете включить мягкую плавающую точку в GCC с помощью -msoft-float. Вы можете перекомпилировать libc для использования аппаратной плавающей точки, если вы ее используете.

96
ответ дан 24 November 2019 в 05:51
поделиться

Существует три способа выполнения арифметики с плавающей точкой:

  • Используйте инструкции с плавающей точкой, если ваш процессор оснащен FPU. (быстро)
  • Попросите компилятор перевести арифметику с плавающей точкой в целочисленную арифметику. (медленно)
  • Используйте инструкции с плавающей запятой и процессор без FPU. Ваш процессор сгенерирует исключение (зарезервированная инструкция, нереализованная инструкция или подобное), а если ядро вашей ОС включает эмулятор плавающей точки, то он будет эмулировать эти инструкции (медленнее всего).
31
ответ дан 24 November 2019 в 05:51
поделиться

Вычисление может выполняться аппаратными средствами с плавающей запятой или программным обеспечением на основе целочисленной арифметики.

Аппаратно это сделать намного быстрее, но многие микроконтроллеры не имеют аппаратного обеспечения с плавающей запятой. В этом случае вы можете либо избегать использования чисел с плавающей запятой (обычно это лучший вариант), либо полагаться на программную реализацию, которая будет частью библиотеки C.

В некоторых семействах контроллеров, например ARM, оборудование с плавающей запятой присутствует в некоторых моделях семейства, но отсутствует в других, поэтому gcc для этих семейств поддерживает оба. Кажется, ваша проблема в том, что вы перепутали два варианта.

7
ответ дан 24 November 2019 в 05:51
поделиться

Похоже, что ваша libc была создана для программных операций с плавающей точкой, в то время как ваш exe был скомпилирован с учетом аппаратной поддержки плавающей точки. В краткосрочной перспективе, вы можете принудительно использовать мягкие плавающие числа в качестве флага компилятора. (если вы используете gcc, я думаю, это -msoft-float)

В долгосрочной перспективе, если ваш целевой процессор имеет аппаратную поддержку операций с плавающей запятой, вы обычно хотите собрать или найти кросс-инструментарий с аппаратной поддержкой плавающей запятой для скорости. Некоторые семейства процессоров имеют варианты моделей с аппаратной поддержкой и без нее. Так, например, просто сказать, что ваш процессор - ARM, недостаточно, чтобы узнать, есть ли у вас аппаратная поддержка операций с плавающей запятой.

12
ответ дан 24 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: