Domanda

Potrebbe qualcuno si prega di aiutare e dimmi come includere IEEE funzioni matematiche in MSVC ++ 6? Ho provato entrambi e, ma ho ancora questi errori:

  

C2065 errore: 'ilogbf': identificatore non dichiarato

     

C2065 errore: 'scalbnf': identificatore non dichiarato

È stato utile?

Soluzione

Edit 3: Speriamo che questo sarà il mio montaggio finale. Mi sono reso conto che non ho affrontato correttamente a questa domanda a tutti. Ho intenzione di lasciare la mia risposta al suo posto come un ammonimento, e perché può avere un valore educativo. Ma capisco perché devo a zero upvotes, e infatti ho intenzione di upvote risposta Andy Ross' perché penso che il suo è molto più rilevante (anche se incompleta, almeno al momento della scrittura). Mi sembra il mio errore è stato quello di prendere le definizioni uomo che ho trovato per ilogbf () un po 'superficialmente. E 'una funzione che prende la parte intera del log di un galleggiante, quanto sia difficile può che essere quello di implementare? Si scopre che funzione è rappresentazione punto veramente è fluttuante IEEE, in particolare l'esponente (in contrapposizione alla mantissa) parte di tale riproduzione. Avrei dovuto sicuramente capito che prima di tentare di rispondere alla domanda! Un punto interessante per me è come una funzione può forse trovare la parte dell'esponente di un galleggiante, come pensavo una regola fondamentale del C è che galleggianti sono promossi a doppie come parte di una chiamata di funzione. Ma questa è tutta discorso a parte, naturalmente.

--- Fine Edit 3, inizio del racconto ammonitore ---

Un po 'googling suggerisce questi sono definiti in alcuni tipi di Unix, ma forse non sono in alcun standard POSIX o ANSI e quindi non forniti con le librerie MSVC. Se le funzioni non sono nella libreria non saranno dichiarati nella math.h. Ovviamente se il compilatore non può vedere le dichiarazioni di questi simboli esterni non sarà felice e si otterrà errori come quelli che si elenco.

L'opera ovvio intorno è quello di creare le proprie versioni di queste funzioni, utilizzando funzioni matematiche che sono fornito. ad esempio

#include <math.h>

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

Edit: Questo non è giusto. A quanto pare, questa funzione dovrebbe utilizzare registro alla base 2, piuttosto che tronchi naturali, in modo che il valore restituito è in realtà un esponente di binario. Dovrebbe anche prendere il valore assoluto del suo parametro, in modo che possa funzionare per i numeri negativi. Lavorerò fino una versione migliorata, se mi chiedete in un commento, altrimenti sono tentato di lasciare che come esercizio per il lettore: -)

L'essenza della mia risposta, vale a dire che ANSI C non richiede questa funzione e che MSVC non lo include, è apparentemente corretta.

Modifica 2: Va bene ho indebolito e ha fornito una versione migliorata senza essere chiesto. Qui si tratta;

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

Altri suggerimenti

Si tratta di funzioni C99, non IEEE754-1985. Microsoft sembra aver deciso che il loro mercato non si preoccupa per il supporto C99, in modo che non si sono preoccupati di fornire loro. Questa è una vergogna, ma a meno di più di voi (gli sviluppatori) si lamentano, non c'è ragione di aspettarsi che la situazione cambierà.

Il nuovo marchio 754 di serie, IEEE754-2008, richiede queste funzioni (clausola 5.3.3, "operazioni logBFormat"), ma che la versione dello standard non sarà ampiamente adottato per molti anni; anche se lo fa arrivare ampia adozione, Microsoft non ha ritenuto opportuno fornire queste funzioni per i dieci anni che sono stati in C99 così perché dovrebbero preoccuparsi di fornire loro solo perché sono nello standard IEEE754?

modifica di notare che scalb e logb sono definiti nel IEEE754-1985 Appendice "Funzioni consigliati e predicati", ma ha detto appendice è esplicitamente "non una parte di" detto standard.

Se sai che sei su un sistema IEEE (e in questi giorni, si fa), non sono necessarie queste funzioni: basta controllare i bit direttamente dalla unioning il doppio con un uint64_t. Presumibilmente si sta utilizzando queste funzioni nell'interesse dell'efficienza, in primo luogo (altrimenti si sarebbe utilizzare operazioni più naturali come log() o exp()), in modo da spendere un po 'di sforzo sulla corrispondenza il codice per la rappresentazione in virgola mobile è probabilmente vale la pena.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top