Pregunta

Bien, creo que realmente estoy viviendo un sueño. Tengo el siguiente trozo de código que puedo compilar y ejecutar en una máquina AIX:

AIX 3 5
PowerPC_POWER5 processor type
IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0003


#include <stdio.h>
#include <math.h>

#define RADIAN(x) ((x) * acos(0.0) / 90.0)

double nearest_distance(double radius,double lon1, double lat1, double lon2, double lat2){
    double rlat1=RADIAN(lat1);
    double rlat2=RADIAN(lat2);
    double rlon1=lon1;
    double rlon2=lon2;
    double a=0,b=0,c=0;

    a = sin(rlat1)*sin(rlat2)+ cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1);
    printf("%lf\n",a);
    if (a > 1) {
      printf("aaaaaaaaaaaaaaaa\n");
    }
    b = acos(a);
    c = radius * b;

    return radius*(acos(sin(rlat1)*sin(rlat2)+
        cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1)));

}

int main(int argc, char** argv) {
  nearest_distance(6367.47,10,64,10,64);
  return 0;
}

Ahora, el valor de 'a' después de que el cálculo se informó como '1'. Y, en esta máquina AIX, parece que 1> 1 es verdadera como mi 'si' se introduce !!! Y mis acos de lo que creo que es '1' vuelve NanQ desde 1 es mayor que 1. ¿Puedo preguntar cómo es posible? No sé qué pensar!

El código funciona bien en otras arquitecturas, donde 'a' realmente toma el valor de lo que pienso es 1 y acos (a) es 0.

¿Fue útil?

Solución

Si usted hace una comparación en la que expctedResult resultado y son tipos float:

if (result == expectedResult)

A continuación, es poco probable que la comparación será verdadera. Si la comparación es cierto, entonces es probable que sea inestable -. Diminutos cambios en los valores de entrada, compilador, o CPU pueden cambiar el resultado y hacer la comparación es falsa

Comparando con epsilon - error absoluto

if (fabs(result - expectedResult) < 0.00001)

Comparando números de punto flotante


Lo que todo científico debe saber acerca de la computadora aritmética de punto flotante

Otros consejos

Imprime los bits. Usted apenas puede ser que deje engañar por algún error de redondeo en la pantalla de los flotadores como números reales decimales.

El printf función, sin precisión especificada, sólo se mostrar los 6 primeros dígitos. Por lo tanto, intente imprimir con un mayor grado de precisión ... es posible que a es un poco mayor que 1, pero sólo por un poco. Si usted quiere hacer las cosas más robusta, en lugar de (a> 1), se puede utilizar (a-1)> épsilon para un cierto valor de épsilon.

1.000000000000000000001 es mayor que 1. ¿Está seguro de que son sólo no ve tantas posiciones? Si el cheque está pasando apostaría eso es su problema.

La solución habitual es utilizar algún tipo de épsilon que le impida tener que preocuparse por los errores de redondeo. es decir, si el doble que tiene debe ser entonces intentar hacer

if ( a > 1.00001f )

Es probablemente lo suficientemente cerca de una manera que no causen problemas:)

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