implementación del libra de libra (flotante, flotante) del kernel androide
Estoy probando casos de la esquina en la llamada del pow
( #include <math.h>
), específicamente pow(-1, Inf)
.
En mi escritorio (Ubuntu) obtengo el resultado 1.0, esto está de acuerdo con la especificación de punto flotante IEEE 2008.
- ¿Es posible realizar llamadas de OpenGL ES desde su código C ++ y Java?
- Cómo imprimir / registrar la dirección de una variable en NDK
- Java Lang UnsupportedClassVersion Error en Xamarin Studio
- Lista y nombres de los gestos con pantalla táctil
- Java equivalente de .NET RSACryptoServiceProvider con SHA-1
Ejecutar la misma prueba cuando se ejecuta el núcleo de Android Gingerbread y me NaN devuelto.
He mirado alrededor y puedo ver que hay muchas implementaciones de pow
en las bibliotecas estándar para diferentes plataformas y en el caso pow(-1, Inf)
que están codificados para producir resultados diferentes.
La pregunta es cuál debe ser considerado correcto? ¿Ideas o pensamientos?
Me disculpo si estoy publicando en el foro equivocado, seguí el enlace de los recursos para desarrolladores de Android y terminé aquí.
- Conversión de tipo de C a Java
- Enviar cadena C ++ a Java a través de JNI
- Reconocimiento de Dongle USB en Android - Beaglebone
- ¿Cómo puedo modificar un mapa de bits de Android en el NDK para que pueda utilizarlo en Java?
- C ++ 11 biblioteca aleatoria en Android JNI
- ¿Cómo mantener la pantalla encendida en Qt para Android?
- Qt - Compilation for Linux no es compilación para Android? ¿Por qué?
- gcc disable -Wall flag para archivos / carpetas específicos
El estándar C es perfectamente claro en este punto (§F.9.4.4); no hay espacio para "ideas o pensamientos":
pow (-1, ± ∞) devuelve 1.
El Anexo F sólo se aplica si una implementación define __STDC_IEC_559__
, pero no hay duda de que 1.0 es la respuesta correcta.
Sospecho que este es un Java-ismo que se ha filtrado en el NDK. (Java define pow(-1,infinity)
como NaN
):
Si el valor absoluto del primer argumento es igual a 1 y el segundo argumento es infinito, entonces el resultado es NaN.
Editar: Desde Matteo objeta que esto "no tiene sentido", voy a ofrecer algunas frases de explicación de por qué el comité hizo esta elección. Aunque lim_ {n-> inf} (-1) ^ n no existe en los números reales, debemos recordar que los números de punto flotante no son números reales y, de hecho, para todos los números de punto flotante suficientemente grandes y
, pow(-1,y)
es +1
. Esto se debe a que todos los números de punto flotante suficientemente grandes son incluso enteros. Desde esta perspectiva, es bastante razonable definir pow(-1,infinity)
como +1
, y esto resulta en realidad conducir a un comportamiento más útil en algunos cálculos de punto flotante.
Hay un número sorprendente de matemáticos extremadamente competentes (así como programadores muy calificados y escritores de compiladores) involucrados tanto con los comités C como con los comités IEEE-754, y no toman estas decisiones de manera negligente. Cada estándar tiene errores, pero este no es uno de ellos.