سؤال

حسنًا ، أعتقد أنني أعيش حلمًا حقًا. لديّ قطعة التعليمات البرمجية التالية التي أقوم بتجميعها وأقوم بتشغيلها على جهاز 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;
}

الآن ، يتم الإبلاغ عن قيمة "A" بعد الحساب على أنها "1". وعلى جهاز AIX هذا ، يبدو أن 1> 1 صحيح مثل "إذا" إذا تم إدخاله !!! و acos الخاصة بي لما أعتقد أنه "1" يعيد Nanq لأن 1 أكبر من 1. هل لي أن أسأل كيف يمكن ذلك حتى؟ لا أعرف ماذا أفكر بعد الآن!

يعمل الرمز بشكل جيد على البنية الأخرى حيث يأخذ "A" حقًا قيمة ما أعتقد أنه 1 و ACOS (A) هو 0.

هل كانت مفيدة؟

المحلول

إذا قمت بمقارنة حيث تكون النتيجة و expctedResult أنواع تعويم:

if (result == expectedResult)

ثم من غير المحتمل أن تكون المقارنة صحيحة. إذا كانت المقارنة صحيحة ، فربما تكون غير مستقرة - قد تكون التغييرات الصغيرة في قيم الإدخال أو التحويل البرمجي أو وحدة المعالجة المركزية تغيير النتيجة وجعل المقارنة خاطئة.

مقارنة مع Epsilon - خطأ مطلق

if (fabs(result - expectedResult) < 0.00001)

من مقارنة أرقام النقاط العائمة


ما يجب أن يعرفه كل عالم كمبيوتر عن الحساب العائم

نصائح أخرى

اطبع البتات. قد تنخدع فقط من خلال بعض الأخطاء الدائرية في عرض العوامات كأرقام حقيقية عشرية.

ال printf الوظيفة ، بدون دقة محددة ، ستظهر لك فقط أول 6 أرقام. لذا ، حاول الطباعة بدرجة أعلى من الدقة ... من الممكن أن يكون A أكبر قليلاً من 1 ، ولكن فقط قليلاً. إذا كنت ترغب في جعل الأمور أكثر قوة ، بدلاً من (A> 1) ، يمكنك استخدام (A-1)> Epsilon لبعض قيمة Epsilon.

1.000000000000000000001 أكبر من 1. هل أنت متأكد من أنك لست مجرد رؤية أماكن عشرية كافية؟ إذا كان هذا الشيك يمر ، فسأني أراهن ، فهذه مشكلتك.

الحل المعتاد هو استخدام شكل من أشكال إبسيلون لمنعك من القلق بشأن التقريب الأخطاء. أي إذا كان يجب أن تكون مضاعفة ثم حاول القيام بذلك

if ( a > 1.00001f )

من المحتمل أن تكون قريبة بما يكفي لأحد حتى لا تسبب لك مشاكل :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top