代码之家  ›  专栏  ›  技术社区  ›  user6161

C-每个数学的“acos()”不同。h头文件?

  •  0
  • user6161  · 技术社区  · 9 年前

    我正在使用一个PIC24F系列微控制器来计算两个纬度和经度坐标之间的距离。我在代码中包含了PIC24F的“math.h”头文件。问题是acos(1)给出了“0.000345”的值,但我期望“0.000086”。与我在eclipse中使用eclipse的数学方法编写的代码相同。h头文件,它给出正确的值“0.000086”。问题是什么?每个数学的“acos()”是否不同。h头文件?

    .....
    theta = lon1 - lon2;
    printf("%f",theta);
    dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta));
    printf("%f", dist);
    dist = acos(dist);
    printf("%f", dist);
    dist = rad2deg(dist);
    printf("%f", dist);
    .....
    

    传递坐标后,每个“dist”变量值如下

    Eclipse输出:

     0.006082
     1.000000
     0.000086
     0.004939
    

    微控制器输出:

    0.006088 
    1.000000
    0.000345
    0.019782     
    

    谢谢

    2 回复  |  直到 9 年前
        1
  •  6
  •   Potatoswatter    9 年前

    GNU库以及任何其他试图符合浮点标准的库,对于 acos(1) . Live example .

    最有可能的是,这个参数不是1,而是稍微小一些。 acos(1 - FLT_EPSILON/2) ,传递1之前的最后一个单精度数字,得到 0.00034526 这是你的结果。也许PIC是一个非常低功耗的设备,没有实现双精度的数学。不小于(但非零) acos 在单精度运算中,结果是可能的。

    除此之外,作为计算错误来源的浮点结果的舍入可能因平台而异。

        2
  •  2
  •   Ignacio Vazquez-Abrams    9 年前

    问题是三角法是 坚固的 精确算法要么非常慢,要么非常大,快速算法要么非常大或非常不精确,而小算法要么非常缓慢,要么非常不精确。大型系统可以避开大型实现,但嵌入式系统由于其资源较少、速度较低,通常只能使用精度较低的结果。