【问题标题】:dsPic33 or PIC24, how accurate float (32bit) and double (64bit) using arctandsPic33 或 PIC24,使用 arctan 的浮点(32 位)和双精度(64 位)有多准确
【发布时间】:2014-06-05 08:45:10
【问题描述】:

角度= arctan(BY/BX)

我很想知道 Math.h 库通过上述方程进行的三角计算有多准确。

我已阅读手册并没有明确说明其准确性。我查看了谷歌搜索,但没有找到明确的答案。

当角度接近 0deg 时,分子 (BY) 小而分母 (BX) 大,By/BX 项的值较低,float(32 位)和 double(64 位)如何受以下因素影响这?。

我知道 64 位更准确,但需要通过这个 dsPIC33 或 PIC24 MCU 查看 32 位和 64 位浮点(0° 到 90°)之间的性能差异。

是否有规则如何使用 arctan 进行准确计算。一位消息人士建议对每个 1/8 段使用 0° 到 45°(0 到 pi/4),这仅适用于 tan 而不是 arctan,对吗?

【问题讨论】:

  • 浮点数非常擅长准确表示接近 0 的数字。

标签: math floating-point trigonometry microchip


【解决方案1】:

IEEE 标准要求所有 FP 指令都具有最大的相对精度,这意味着除了尾数的最后一位(忽略对前面位的进位影响)之外的所有位都应该是正确的。

如果您想避免在进行除法时损失精度(有吗?),请使用 atan2 函数(如果可用)。


更新:如果您想针对理论上正确的版本测试提供的函数,您可以使用以下算法,该算法使用二分法和反切的泰勒级数来获取扇区 0<x && |y|<x

partial_atan2(y,x) {
    r = sqrt(x*x+y*y);
    c = x/r;
    s = y/r;
    repeat 4 times {
        c = sqrt((1+c)/2);
        s = s/(2*c);
    }
    t = s/c;
    t2 = t*t;
    pow = -t2;
    sum = 1; 
    k = 3;
    while  1+abs(pow) > 1 {
        sum = sum + pow/k;
        pow = -pow*t2;
        k = k+2;
    }
    return 16*t*sum;
}

【讨论】:

  • 我很难将您的第一句话与我对 IEEE 754 标准的理解相协调。首先,IEEE 754 标准要求对某些运算进行正确舍入,这意味着有效数字的所有位都是正确的,对于“正确”的含义并不意味着产生数学结果,因为这个结果往往无法代表。在目前的技术水平下不能要求正确舍入的基本函数根本没有精度要求,但建议使用“忠实”(精度为 1 ULP),因为它是一个很好的折衷方案。
  • 用正确位表示准确性令人困惑(例如,0.111111 和 1.000000 在所有 7 位上都不同,但表示的数字仅相差 2^-6)。这对于纸笔计算是可以接受的,但没有理由再使用数字作为精度单位了。
  • @PascalCuoq:如果您发布技术上更正确的 cmets 作为答案,我会收回我的答案。
  • 或者归结为测试方法。据我了解,算术运算和平方根必须在 1/2 ULP 内精确,对于合理的域,另一个应该在 1 ULP 内。显然,sin 和 cos 对于大的争论永远不可能是精确的。对于 x 和 x+1 不再可区分的参数 x,它们变得毫无意义。
  • 我对基于各种测试值的精度性能证明以及提供的结果更感兴趣,这些结果在最精确的机器上比较了 32 位、64 位(在 XC16 库中)和 128 位浮点数,所以我可以看到 ATAN2 的实际表现及其局限性。我以某种方式阅读了有关 IEEE 754 和教程的内容,以描述 32 位和 64 位浮点数的区别。我更喜欢查看 ATAN2 的实际执行情况,而不是 IEEE 754 文档中复杂/模糊的陈述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2020-03-09
  • 2020-04-24
  • 1970-01-01
  • 2015-03-25
  • 2011-02-27
  • 2010-10-19
相关资源
最近更新 更多