Comment déclarer des fonctions mathématiques IEEE comme « ilogbf » dans MSVC ++ 6?

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

  •  19-09-2019
  •  | 
  •  

Question

Quelqu'un pourrait-il aider s'il vous plaît et me dire comment inclure des fonctions mathématiques IEEE dans MSVC ++ 6? J'ai essayé les deux et, mais je reçois toujours ces erreurs:

  

error C2065: 'ilogbf': identificateur non déclaré

     

error C2065: 'scalbnf': identificateur non déclaré

Était-ce utile?

La solution

Edit 3: Il faut espérer que ce sera ma dernière édition. Je suis venu à réaliser que je ne l'ai pas bien abordé cette question du tout. Je vais laisser ma réponse en place comme un récit édifiant, et parce qu'il peut avoir une valeur éducative. Mais je comprends pourquoi j'ai zéro upvotes, et en fait, je vais upvote la réponse de Andy Ross parce que je pense que son est beaucoup plus pertinente (bien incomplète au moins au moment de l'écriture). Il me semble mon erreur était de prendre les définitions de Man je trouve pour ilogbf () un peu superficiellement. Il est une fonction qui prend la partie entière du journal d'un flotteur, à quel point cela peut-il mettre en place? Il se trouve que la fonction est vraiment est sur la représentation à virgule flottante IEEE, en particulier l'exposant (par opposition à la mantisse) une partie de cette représentation. Je certainement rendu compte que avant d'essayer de répondre à la question! Un point intéressant pour moi est de savoir comment une fonction peut éventuellement trouver la partie exposant d'un flotteur, comme je pensais une règle fondamentale de C est que les flotteurs sont promus à des doubles dans le cadre d'un appel de fonction. Mais c'est toute une discussion séparée bien sûr.

--- Fin de modifier 3, début de récit édifiant ---

Un peu googler suggère ceux-ci sont définis dans certaines versions d'Unix, mais peut-être ne sont en aucune norme Posix ou ANSI et donc pas fourni avec les bibliothèques MSVC. Si les fonctions ne sont pas dans la bibliothèque, ils ne seront pas déclarés dans math.h. Il est évident que si le compilateur ne peut pas voir les déclarations qu'il ne sera pas pour ces symboles externes heureux et vous obtiendrez des erreurs comme celles que vous indiquez.

Le travail évident est autour de créer vos propres versions de ces fonctions, en utilisant des fonctions mathématiques que sont fournis. par exemple,

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    double d2 = log(d1);
    int ret = (int)d2;
    return ret;
}

Edit: Ce n'est pas tout à fait raison. Apparemment, cette fonction doit utiliser journal à la base 2, plutôt que logarithmes naturels, de sorte que la valeur retournée est en fait un exposant binaire. Il devrait également prendre la valeur absolue de son paramètre, de sorte qu'il fonctionne pour les nombres négatifs. Je travaillerai jusqu'à une version améliorée, si vous me demandez dans un commentaire, sinon je suis tenté de laisser cela comme un exercice pour le lecteur: -)

L'essence de ma réponse, à savoir que la norme ANSI C ne nécessite pas cette fonction et que MSVC ne comprend pas, est apparemment correct.

Edit 2: D'accord, je l'ai AFFAIBLIE fourni une version améliorée sans être demandé. Ici, il est;

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    if( d1 < 0 )
        d1 = -d1;
    double d2 = log(d1) / log(2);  // log2(x) = ln(x)/ln(2)
    int ret = (int)d2;
    return ret;
}

Autres conseils

Ce sont des fonctions C99, non IEEE754-1985. Microsoft semble avoir décidé que leur marché ne se soucie pas de soutien C99, donc ils ont pas pris la peine de les fournir. C'est une honte, mais à moins que plus d'entre vous (les développeurs) se plaignent, il n'y a aucune raison de penser que la situation changera.

La toute nouvelle 754 standard, IEEE754-2008, exige que ces fonctions (article 5.3.3, « opérations logBFormat »), mais cette version de la norme ne sera pas largement adopté depuis plusieurs années; même si elle n'atteint une large adoption, Microsoft n'a pas jugé bon de fournir ces fonctions pour les dix ans, ils ont été en C99 alors pourquoi seraient-ils pris la peine de leur fournir simplement parce qu'ils sont dans la norme IEEE754?

modifier Notez que scalb et logb sont définis dans le IEEE754-1985 Annexe « fonctions recommandées et prédicats », mais ledit appendice est explicitement « ne fait pas partie de » ladite norme.

Si vous savez que vous êtes sur un système IEEE (et ces jours-ci, vous faites), ces fonctions ne sont pas nécessaires: inspecter juste les bits directement par unioning le double avec uint64_t. On peut supposer que vous utilisez ces fonctions dans l'intérêt de l'efficacité en premier lieu (sinon vous seriez en utilisant des opérations plus naturelles comme log() ou exp()), dépenser un peu d'effort adaptez votre code à la représentation en virgule flottante est probablement utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top