Frage

Könnte bitte jemand helfen und mir sagen, wie IEEE mathematische Funktionen in MSVC enthält ++ 6? Ich habe versucht, beide und, aber ich habe immer noch diese Fehler:

  

Fehler C2065: 'ilogbf': nicht deklarierter Bezeichner

     

Fehler C2065: 'scalbnf': nicht deklarierter Bezeichner

War es hilfreich?

Lösung

Edit 3: Hoffentlich wird meine letzte bearbeiten sein. Ich habe erkannt, dass ich nicht richtig, diese Frage überhaupt gerichtet. Ich werde meine Antwort an Ort und Stelle als warnendes Beispiel verlassen, und weil es einige erzieherischen Wert haben kann. Aber ich verstehe, warum ich Null upvotes haben, und in der Tat werde ich Andy Ross' Antwort auf upvote, weil ich denke, dass seine viel mehr relevant (obwohl unvollständig zumindest zum Zeitpunkt des Schreibens). Es scheint mir, mein Fehler der Mann Definitionen zu nehmen war ich für ilogbf () ein wenig oberflächlich gefunden. Es ist eine Funktion, die den ganzzahligen Teil des Stammes eines Schwimmers nimmt, wie schwer kann das implementieren? Es stellt sich heraus, was die Funktion wirklich ist, IEEE Gleitkommadarstellung, insbesondere den Exponenten Teil dieser Darstellung (in Bezug auf die Mantisse entgegengesetzt). Ich sollte auf jeden Fall, dass erkannt haben, bevor Sie versuchen, die Frage zu beantworten! Ein interessanter Punkt ist für mich wie eine Funktion möglicherweise den Exponenten Teil eines Schwimmers finden, da ich eine Grundregel von C gedacht ist, dass Schwimmern verdoppelt sich als Teil eines Funktionsaufrufs gefördert werden. Aber das ist eine ganz separate Diskussion natürlich.

--- Ende der Bearbeitung 3, von warnende Geschichte beginnen ---

Ein wenig googeln legt nahe, diese sind in einigen Varianten von Unix definiert, aber vielleicht nicht in jedem Posix oder ANSI-Standard und so nicht mit den MSVC-Bibliotheken zur Verfügung gestellt. Wenn die Funktionen nicht in der Bibliothek sind, werden sie nicht in der Datei math.h. deklariert werden Natürlich, wenn der Compiler kann nicht Erklärungen für diese fremden Symbole sehen es nicht gerne, und Sie werden Fehler wie die, die Sie Liste erhalten.

Die offensichtliche Arbeit um Ihre eigenen Versionen dieser Funktionen zu erstellen, mathematische Funktionen verwenden, die sind zur Verfügung gestellt. zB

#include <math.h>

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

Edit: Das ist nicht ganz richtig. Offensichtlich soll diese Funktion lügt zur Basis 2, anstatt natürliche Protokolle verwenden, so dass der zurückgegebene Wert tatsächlich ein binärer Exponent ist. Es sollte auch den absoluten Wert seines Parameter übernehmen, so dass es auch für negative Zahlen funktioniert. Ich werde eine verbesserte Version aufzuarbeiten, wenn Sie mich in einem Kommentar fragen, sonst bin ich das als eine Übung für den Leser zu verlassen versucht: -)

Das Wesen meiner Antwort, das heißt, dass ANSI C nicht diese Funktion nicht erforderlich und dass MSVC nicht enthält es ist offensichtlich richtig.

Edit 2: Okay, ich habe geschwächt und eine verbesserte Version zur Verfügung gestellt, ohne gefragt zu werden. Hier ist;

#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;
}

Andere Tipps

Dies sind C99-Funktionen, nicht IEEE754-1985. Microsoft scheint entschieden zu haben, dass ihr Markt nicht über C99 Unterstützung kümmert, damit sie sie nicht die Mühe gemacht haben, zu bieten. Das ist schade, aber es sei denn, mehr von Ihnen (Entwickler) beschweren, gibt es keinen Grund zu erwarten, dass sich die Situation ändern wird.

Das brandneue 754-Standard, IEEE754-2008, erfordert diese Funktionen (Ziffer 5.3.3, „logBFormat operations“), aber diese Version des Standards wird nicht weithin bekannt für mehrere Jahre erlassen werden; auch wenn es breite Akzeptanz tut erreichen, hat Microsoft nicht fit gesehen, diese Funktionen für die 10 Jahre bieten sie in C99 waren also warum sollten sie die Mühe, sie zu liefern, nur weil sie in der IEEE754 Standard sind?

Bearbeiten zur Kenntnis, dass scalb und logb definiert sind, in dem IEEE754-1985 Anhang „Empfohlene Funktionen und Prädikate“, aber die Anlage ist ausdrücklich „nicht ein Teil“ sagte Standard.

Wenn Sie wissen, dass Sie auf einem IEEE-System (und in diesen Tagen, Sie tun), werden diese Funktionen nicht benötigt: inspiziert nur die Bits direkt durch das Doppel mit einem uint64_t unioning. Vermutlich verwenden Sie diese Funktionen im Interesse der Effizienz an erster Stelle (sonst würden Sie mehr natürlichen Vorgänge wie log() oder exp() verwenden), so eine wenig Mühe zu verbringen Sie Ihren Code auf die Floating-Point-Darstellung auf Anpassung ist wohl die Mühe wert.

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