Die Suche nach einer reinen c-Version von math.h Funktionen (keine Co-Prozessor-Unterstützung) [geschlossen]

StackOverflow https://stackoverflow.com/questions/4147972

Frage

Ich muß die Arbeit mit einiger (semi-) automatischen Verifikationssoftware (CBMC (link) ), die auf C-Quellen statisch arbeitet. Floating-Point unterstützt wird, aber es gibt keine Definitionen für alle mathematischen Funktionen. Der Versuch ist zu prüfen, ob es möglich ist, damit numerische Software zu überprüfen.

Also muss ich diese Funktionen. Ich suche nach einigen math.h Definitionen ohne Koprozessor Verwendung (z sqrt, pow, Rest, tan; int / float / double).

Als ich es in einem libc sah mit einigen Linux-Distributionen ausgeliefert (vielleicht jetzt eglibc), habe ich immer einen Punkt erreicht, wo es einige Prozessor-Spezifika sind eine Hardware-sqrt-Funktion zum Beispiel bedeutet.

Teil 1: Suche nach Software-Implementierungen

Was ich brauche, ist eine Bibliothek unterstützt mathematische Funktionen mit den folgenden Eigenschaften:

  • IEEE Gleitkommaoperation wird unterstützt, aber eine Bibliothek rein auf ganze Zahlen Betrieb wäre auch toll, vielleicht besser.
  • Correctness ist ein kritischer Faktor. (Bekannte Fehler für spezielle Fälle in einigen Quellen verborgen sind nicht so cool). Die Ergebnisse sollten auch im Hinblick auf den IEEE-754 (zum Beispiel Regeln für sqrt) korrekt sein.
  • Keine Verwendung von Co-Prozessor Anrufen. Reine Software. C ist bevorzugt, aber asm sollte in Ordnung sein.

Bisher suchte ich ein bisschen für verschiedene libc-Implementierungen, insbesondere solche in Bezug auf eingebettete Systeme. Ich denke, die meisten dieser Bibliotheken Portabilität und Größe der kompilierten Programme zielen, aber schwer zu sagen, ob sie prozessorspezifische Befehle verwenden.

  • fdlibm scheint auf den ersten Blick einige reine Software-Definitionen zu haben. Ich werde diese weiter untersuchen. Aber es gibt einige Fehler in den Quellen erwähnt (Code ist nicht Standard).
  • newlib scheint die gleichen Definitionen zu bringen (basierend auf Code von Sun Microsystems). Aber ich kann im Moment nicht mit Sicherheit sagen, ob diese Software-Versionen alway verwendet werden, so dass es vielleicht einig Co-Prozessor ruft ich im Moment nicht sehen (siehe Teil 2).
  • uClibc scheint mit newlib das Merkmal zu teilen.

Teil 2: das Verständnis der Struktur dieser Implementierungen

  • Könnte jemand geben Sie mir eine kurze Einführung in die Struktur dieser Mathematikbibliotheken. Wie tun sie schicken die verschiedenen Versionen (zum Beispiel eines spezifischer Co-Prozessor)?

  • Und was die Bedeutung dieser verschiedenen Präfixe in den Dateinamen sind. e_sqrt.c, k_sin, s_sin?

Ich würde gerne über einige Bibliotheken zu hören, die könnte für mich nützlich sein. Ich würde es vorziehen, eine Bibliothek zu nehmen, wie es kommt, aber wenn es notwendig ist, ist es auch möglich, für einige Einzelfunktions-Implementierungen zu suchen und eine kleine Bibliothek aufzubauen. Ich werde nicht alle Funktionen in math.h definiert verwenden.

Diese und this SO-Beiträge sagen, dass die Java Math Umsetzung wird / wurde basierend auf fdlibm , die Geräusche, die diese Bibliothek ist der Weg zu gehen. Wer weitere Informationen zu dieser Bibliothek soll ich das wissen?

Es scheint, dass ich viele Möglichkeiten, einschließlich der folgenden zwei haben:

  1. Verwenden Sie glibc und Kompilierung in Software-Modus . Das Problem ist, dass ich nicht der automatischen Systemüberprüfung Tool (in konfigurieren) verwenden kann. Ich habe alle Informationen, manuall gebeny. Gibt es irgendwelche Fahnen die Verwendung des fp-Coprozessor zu verbieten und SIMD-Operationen zu verbieten? fp-ohne einen Start sein soll, dann ist es auch mit Soft-Schwimmer, wenn es kompiliert. Ich gehe davon aus, dass der Übersetzungsvorgang mehr oder weniger abhängig von einer bestimmten Entscheidung für einen Host ist (wie Arm ...).
  2. Verwenden fdlibm (zur Zeit bevorzugt). Problem: Wie verknüpfe ich meine Programme, um es? Ich brauche die nicht-libm Funktionen wie assert, sondern will Link gegen meine fdlibm und nicht den System-libm, die installiert ist (so -nodefaultlibs die Verwendung von assert wird verbieten).
War es hilfreich?

Lösung

Es gibt eine vollständige Software-Implementierung von IEEE-754 in glibc / sysdeps / IEEE754 . Wenn Sie die Bibliothek zusammenstellen könnte es automatisch in einer Architektur bestimmten Version ersetzen (zB ia64/fpu/e_acosf.S) eine Funktion, sondern die gesamte Bibliothek ist in Software als auch umgesetzt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top