Pregunta

Podría alguien por favor ayuda y dime cómo incluir IEEE funciones matemáticas en MSVC ++ 6? He intentado tanto y, aunque sigo teniendo estos errores:

  

C2065 de error: 'ilogbf': identificador no declarado

     

C2065 de error: 'scalbnf': identificador no declarado

¿Fue útil?

Solución

Editar 3: Con suerte esta será mi última edición. Me he dado cuenta de que no he abordado adecuadamente la cuestión en absoluto. Voy a dejar mi respuesta en su lugar como una advertencia, y debido a que puede tener algún valor educativo. Pero entiendo por qué tengo cero upvotes, y de hecho voy a upvote respuesta Andy Ross, porque creo que la suya es mucho más relevante (aunque incompleta, al menos en el momento de la escritura). Me parece que mi error fue tomar las definiciones hombre que encontré para ilogbf () un poco por encima. Es una función que toma la parte entera del registro de un flotador, lo difícil que puede ser para poner en práctica? Resulta que lo que es la función de representación de punto realmente está flotando IEEE, en particular, el exponente (en contraposición a la mantisa) parte de esa representación. Definitivamente debería haber dado cuenta de que antes de intentar responder a la pregunta! Un punto interesante para mí es como una función posiblemente puede encontrar la parte exponente de un flotante, como pensaba una regla fundamental de C es que los flotadores son promovidos a los dobles como parte de una llamada de función. Pero eso es toda una discusión aparte, por supuesto.

--- Fin de la edición 3, se inicia de advertencia ---

Un poco de googling sugiere éstas se definen en algunas versiones de Unix, pero tal vez no están en ningún estándar POSIX o ANSI y por lo tanto no cuentan con las bibliotecas de MSVC. Si las funciones no están en la biblioteca que no se declararán en math.h. Obviamente, si el compilador no puede ver las declaraciones de estos símbolos externos que no será feliz y obtendrá errores como los que usted lista.

El trabajo es evidente en torno a crear sus propias versiones de estas funciones, el uso de funciones matemáticas que son proporcionan. por ejemplo,

#include <math.h>

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

Edit: Esto no es del todo bien. Al parecer, esta función debe utilizar registro a la base 2, en lugar de logaritmos naturales, por lo que el valor devuelto es en realidad un exponente binario. También se debe tomar el valor absoluto de su parámetro, por lo que va a trabajar para los números negativos. Voy a trabajar hasta una versión mejorada, si usted me pregunta en un comentario, de lo contrario me siento tentado a dejar que como ejercicio para el lector: -)

La esencia de mi respuesta, es decir, que la norma ANSI C no requiere esta función y que MSVC no lo incluye, es aparentemente correcta.

Edición 2: Está bien que he debilitado y presentó una versión mejorada sin ser pedido. Aquí es;

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

Otros consejos

Estas son funciones C99, no IEEE754-1985. Microsoft parece haber decidido que su mercado no se preocupa por el apoyo C99, lo que no han tomado la molestia de proporcionarles. Esto es una vergüenza, pero a menos que más de ustedes (los desarrolladores) se quejan, no hay razón para esperar que la situación cambie.

El nuevo estándar de la marca 754, IEEE754-2008, requiere que estas funciones (Cláusula 5.3.3, "operaciones logBFormat"), pero esa versión de la norma no será ampliamente adoptado por varios años más; incluso si lo hace llegar a una amplia adopción, Microsoft no ha tenido a bien proporcionar estas funciones para los diez años que han estado en C99 así que ¿por qué molestarse para proporcionarles sólo porque están en el estándar IEEE754?

editar en cuenta que scalb y logb se definen en el IEEE754-1985 Apéndice "Funciones recomendados y los predicados", pero dijo que el apéndice es explícitamente "no forma parte de" dicho estándar.

Si usted sabe que está en un sistema IEEE (y en estos días, que lo hacen), no se necesitan estas funciones: acaba de inspeccionar los bits directamente por unificante del doble con una uint64_t. Es de suponer que está utilizando estas funciones en interés de la eficiencia en el primer lugar (de lo contrario se estaría utilizando operaciones más naturales como log() o exp()), así que pasar un poco de esfuerzo en la coincidencia de su código para la representación de punto flotante es probable que valga la pena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top