Frage

Richtig, ich denke, dass ich wirklich ein Traum lebe. Ich habe das folgende Stück Code, das ich kompilieren und laufen auf einer AIX-Maschine:

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

Nun wird der Wert von ‚a‘ nach der Berechnung als berichtet wird ‚1‘. Und auf dieser AIX-Maschine, sieht es aus wie 1> 1 gilt als meine ‚wenn‘ eingegeben wird !!! Und meine acos von dem, was ich denke, ist ‚1‘ kehrt NaNq seit 1 ist größer als 1. Darf ich fragen, wie das überhaupt möglich ist? Ich weiß nicht, was mehr denken!

Der Code funktioniert gut auf anderen Architekturen, bei denen ‚a‘ den Wert nimmt wirklich von dem, was ich denke, ist 1 und acos (a) 0 ist.

War es hilfreich?

Lösung

Wenn Sie das tun einen Vergleich in dem Ergebnis und expctedResult sind Schwimmertypen:

if (result == expectedResult)

Dann ist es unwahrscheinlich, dass der Vergleich wahr ist. Ist der Vergleich wahr ist, dann ist es wahrscheinlich instabil -. Winzige Veränderungen der Eingangswerte, Compiler oder CPU kann das Ergebnis ändern, und der Vergleich falsch machen

Im Vergleich mit Epsilon - absoluten Fehler

if (fabs(result - expectedResult) < 0.00001)

Beim Vergleich Gleitkommazahlen


Was jeder Informatiker Should Know About Gleitkommaarithmetik

Andere Tipps

die Bits ausdrucken. Sie könnten nur durch einen Rundungsfehler in der Anzeige des Schwimmer als Dezimalzahl reelle Zahlen täuschen zu werden.

Die printf Funktion, ohne eine spezifizierte Genauigkeit, wird nur zeigen Ihnen die ersten 6 Ziffern. Also, versuchen Sie mit einem höheren Grad an Präzision Druck ... es möglich ist, dass ein etwas größer als 1 ist, sondern nur durch ein wenig. Wenn Sie die Dinge robuster machen wollen, statt (a> 1), können Sie (a-1)> epsilon für einen Wert von Epsilon.

1,000000000000000000001 größer als 1. Sind Sie sicher, dass nur Sie nicht genug Dezimalstellen sehen? Wenn das Kontroll vergeht Ich wette, das ist Ihr Problem.

Die übliche Lösung ist eine Form von epsilon verwenden Sie Rundungsfehler sich Gedanken zu stoppen. dh wenn der Doppel Sie sollte dann versuchen zu tun

if ( a > 1.00001f )

Es ist wahrscheinlich nahe genug, um ein, um nicht Probleme zu verursachen:)

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