This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069:添加浮点数错误

Guru**** 2530350 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604598/tms320f28069-adding-floating-point-number-error

器件型号:TMS320F28069

大家好、客户正在通过多次在 CPU 和 CLA 中添加来测试28069。

在 CLA 中、ClaTask4将数字11.7添加到20001次。

ClaTask8将启动变量并执行一次。

下面是 main.c 中的代码、在 CPU 中添加11.7次、20001次、然后强制执行 ClaTask4。

结果如下:

ClaTmpData1是在 CLA 中为20001添加11.7的结果。

ClaTmpData2是在 CPU 中添加11.7 20001次的结果。

但是11.7*20001=234011.7,这不同于 CPU 或 CLA 的结果。

我已经在28379d launchpad 上对其进行了测试、结果完全相同。 我注意到、即使添加了11.7一次、我也得到了以下结果

您能告诉我调试的原因是什么、或者我可以做什么吗? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ClaTask4代码就在这里。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Howard、

    当您使用固定浮点数重复递增浮点数时、最终将到达累加值不能用与递增相同的指数表示的点。  发生这种情况时、精度将会降低。  这是使用浮点的结果、任何 CPU 都会发生这种情况。  随附的幻灯片可能会使其更清晰。

    如果您计算的实际值为11.7 * 20001、则会发现答案是2340117。  因此,正如我所解释的,这两个答案都是错误的。  您无法在单精度浮点中找到正确的答案。

    它们之所以不同、可能是因为浮点转换略有不同、但在进一步研究 这一点之前、我想问: 您对结果做了什么?  

    此致、

    Richard

    e2e.ti.com/.../FP-precision.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更正:结果为234011.7 (未达到小数点)、但两个结果仍然错误。  

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 客户只是进行测试以测量器件的计算能力。 因此、您的意思是、由于固定浮点数具有固定的8位来表示指数、因此小数为23位、因此在某些情况下精度会丢失、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没错。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Howard、

    只需添加:可能导致或导致此误差的另一个因素是浮点转换中使用的舍入模式。  这也可以解释为什么您看到 CPU 和 CLA 结果之间存在差异。  请查看以下帖子:

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/500481/1815777

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、这对您有很大帮助。 您是否有任何想法、我如何通过在20001年中添加11.7获得正确答案? 现在、我可以使用 CLA 和 CPU 获得相同的结果、但结果仍然错误。 代码中的任何修改都可以实现这一点吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Howard、

    您不能使用单精度浮点来执行此操作。 这是数字类型的限制。

    在本例中、您可以使用 IQ 数学获得更精确的答案。 您需要 Q13或更低的电压才能获得足够的范围、但仍会有一个小误差。

    另一种选择是使用64位"长双精度"数据类型。 这将给出答案234011.70000007941。

    错误包括:
    浮点:+41.909
    _IQ13:-0.9766
    长双精度:+0.00000007941

    此致、

    Richard