Ищу чистую c-версию функций math.h (без поддержки сопроцессора)

Мне приходится работать с некоторым (полу-) автоматическим программным обеспечением для проверки (CBMC (link)), которое статически работает с исходниками C. Поддерживаются числа с плавающей запятой, но нет определений для всех математических функций. Попытка проверить, можно ли с его помощью проверить числовое программное обеспечение.

Так что мне нужны эти функции. Я ищу некоторые math.h определения без использования сопроцессора (например, sqrt, pow, остаток, tan; int/float/double).

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

Часть 1: поиск программных реализаций

Мне нужна библиотека, поддерживающая математические функции со следующими характеристиками:

  • IEEE Floating-Point поддерживается, но библиотека, работающая исключительно с целыми числами, тоже была бы отличной, а может быть, и лучше.
  • Правильность – решающий фактор. (известные баги для особых случаев, скрытые в некоторых источниках, не так уж и круты). Результаты также должны быть правильными с точки зрения IEEE-754 (например, правила для sqrt).
  • Не использовать вызовы сопроцессора. Чистый софт. C предпочтительнее, но asm тоже подойдет.

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

  • ** На первый взгляд кажется, что fdlibm имеет чисто программные определения. Я проверю это дальше. Но есть некоторые ошибки, упомянутые в исходниках (код не стандартный).
  • **newlib, по-видимому, содержит те же определения (на основе кода микросистем Sun). Но на данный момент я не могу точно сказать, всегда ли используются эти версии программного обеспечения, так что, возможно, есть какие-то вызовы сопроцессора, которых я не вижу в данный момент (см. часть 2).
  • **uClibc похоже имеет те же характеристики, что и newlib.

Часть 2: понимание структуры этих реализаций

  • Может ли кто-нибудь дать мне краткое введение в структуру этих математических библиотек. Как они отправляют различные версии (например, конкретный сопроцессор)?

  • И что означают эти разные префиксы в именах файлов. e_sqrt.c, k_sin, s_sin?

Я был бы рад услышать о некоторых библиотеках, которые могут оказаться полезными для меня. Я бы предпочел брать библиотеку в том виде, в каком она есть, но когда это необходимо, также можно поискать какие-то отдельные реализации функций и создать небольшую библиотеку. Я не буду использовать все функции, определенные в math.h.

Это и это SO-сообщения говорят, что реализация Java Math / был основан на fdlibm, что звучит так, будто эта библиотека — то, что нужно. Кто-нибудь, у кого есть дополнительная информация об этой библиотеке, которую я должен знать?

Кажется, у меня есть много возможностей, включая следующие два:

  1. Используйте glibc и скомпилируйте в программном режиме. Проблема в том, что я не могу использовать какие-либо инструменты автоматической проверки системы (в конфигурации). Приходится вводить всю информацию вручную. Есть ли флаги для запрета использования fp-сопроцессора и запрета simd-операций? fp-without должен быть началом, тогда он также использует soft-float, если он компилируется. Я ожидаю, что процесс компиляции более или менее зависит от конкретного решения хоста (например, руки...).
  2. Используйте fdlibm (на данный момент предпочтительнее). Проблема: как связать с ним свои программы? Мне нужны не-libm-функции, такие как assert, но я хочу связать с моей fdlibm, а не с установленной системной libm (поэтому -nodefaultlibs запретит использование assert).

person sascha    schedule 10.11.2010    source источник
comment
я думаю, вам просто нужно передать какой-то флаг, например, использовать эмуляцию во время компиляции   -  person Andrey    schedule 10.11.2010
comment
какой процессор x86 не имеет FPU за последние ~ 2 десятилетия? Если вы используете x86, нет причин использовать такое программное обеспечение с плавающей запятой, если только вам не нужна более высокая точность. Если вы используете другую архитектуру без FPU, то очевидно, что математическая библиотека для нее должна вычислять эти функции вручную без встроенных инструкций.   -  person phuclv    schedule 22.03.2016


Ответы (1)


Полная программная реализация IEEE-754 содержится в glibc/sysdeps/ieee754. Когда вы компилируете библиотеку, она может автоматически заменять определенную версию архитектуры (например, ia64/fpu/e_acosf.S) некоторой функцией, но вся библиотека также реализована в программном обеспечении.

person Ben Jackson    schedule 10.11.2010