Forum Programmation.c Comment utiliser les fonctions trigonométriques standard ?

Posté par  (site web personnel) .
Étiquettes : aucune
-2
26
sept.
2008
Bonjour,

je dois utiliser dans mon projet des fonctions de trigo. Sauf que juste en incluant math.h, les symboles du type atan2 ne sont pas reconnus.
Sur http://www.delorie.com/djgpp/doc/libc/libc_530.html , on me dit qu'il y a deux versions de fonctions mathématiques : une version embarquée dans la libc, et une autre dans la libm. J'ai réussi à utiliser la libm en incluant et en passant à gcc l'option -lm, mais je préfèrerais utiliser la version de la libc, pour ne pas me farcir une dépendance supplémentaire. Mais sans lier la libm, les symboles ne sont pas reconnus... Quelqu'un aurait une solution ?

Je compile avec GCC 4.22 et j'utilise une glibc 2.6.1.

Merci
  • # Lie avec libm

    Posté par  (site web personnel) . Évalué à 3.

    Ces fonctions sont défnies dans la librairie libm. Si tu veux les utiliser, il faut lier avec libm en passant l'option -lm a gcc. Il n'y a pas de miracle.
  • # Tu veux des fonctions inline?

    Posté par  . Évalué à 9.

    Bonjour,

    En fait, la formulation:
    "une version embarquée dans la libc, et une autre dans la libm"
    est incorrecte. Toutes les fonctions mathématiques sont dans la libm.

    Par contre, si tu est pret à faire des concessions sur la précision (théoriquement, en tout cas), au profit de la vitesse (moins théorique), tu peux utiliser les fonctions inline.

    Pour ce faire, il faut ajouter les options suivantes lors de la compilation:
    -ffast-math -O3
    À partir de ce moment, plus besoin de linker la libm, sauf fonction spéciale.

    Enfin, je concluerai en disant qu'il ne faut pas t'inquiéter de linker avec la libm, ce n'est pas sale, plein de coders bien le font. D'ailleurs, elle sera déjà en mémoire à cause d'un autre programme, donc...
    • [^] # Re: Tu veux des fonctions inline?

      Posté par  (site web personnel) . Évalué à 2.

      C'est pas trop que je ne veuille absolument pas lier la libm, c'est surtout que je ne sais pas trop comment générer la tripaille autotools qui correspond :-). J'ai rajouté
      AC_CHECK_LIB(m, main,,AC_MSG_ERROR(requires libm, the standard mathematics library))
      dans mon configure.ac, mais du coup tous mes exécutables vont lier la libm, même ceux qui n'en ont pas besoin... Alors j'essayais de m'en passer. Effectivement, la perte de précision ne m'impacte pas (j'arrondis les résultats à l'entier le plus proche avec rint), mais par contre je ne sens pas trop le -O3 juste pour ça. J'ai déjà lu qu'au delà de -O2 les optimisations deviennent un peu hasardeuses. Merci en tout cas pour ces précisions :-)
      • [^] # Re: Tu veux des fonctions inline?

        Posté par  . Évalué à 3.

        Evidemment, vu sous cet angle, cela change tout...
        Perso, j'évite les autotools comme la peste, bien trops compliqué pour mon petit cerveau usé par le poids des ans...

        Ce qui me gêne dans la solution, c'est que:
        - autotools, c'est fait pour être portable;
        - -ffast-math, c'est gcc only, nettement moins portable;
        - les fonctions mathématiques en inline, c'est GNU-libc only, donc peu portable aussi;
        - la libm est un peu particulière, et pas obligatoire sur certains systèmes...

        Pour bien faire les choses, il faudrait que tu voie comment dans d'autres projet:
        - ils traitent le cas particulier de la libm;
        - ils définissent les bibliothèques au cas par cas pour les binaires, pour ne pas linker quand c'est inutile.

        Sinon pour info, par rapport à la solution que je proposait, la seule option qui t'aurai intéréssé et qui est apportée par le -O3, c'est en fait l'option -finline-functions que tu peux utiliser seule.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.