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.

[参考译文] Compiler/F28M36H53B2:FLOAT与DOUBLE的sin函数的奇数行为

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/582684/compiler-f28m36h53b2-odd-behavior-of-sin-function-with-float-vs-double

部件号:F28M36H53B2
主题:controlSUITE中讨论的其他部件

工具/软件:TI C/C++编译器

您好,

我遇到了一个奇怪的问题,关于使用RTS2800 FPU库中的double sin (double)函数。 当我使用单精度浮点作为函数的输入和输出时,我偶尔会在函数的输出处获得+INF。 我的输入线性增加在0到2*PI之间。 当我使用float sinf (float)函数时,问题消失了。 我正在使用 TI v 15.12 .3.LTS。 对此问题有何想法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能给我们一个x示例,其中sin(x)=+inf而sinf(x)!=+inf?

    您是否正在使用--fp_mode=strict?

    您是否在使用--TMU_support?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在使用--fp_mode=strict。
    我没有使用--TMU_support。
    就给您一个具体的例子而言,这种情况似乎偶尔发生在各种输入中。 我曾经在Delfino F2.8335万 (我移植到Concerto)上使用完全相同的代码,但问题从未在那里出现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否说给定的sin (x)的结果会从一个照射行程变为下一个照射行程?
    另外,您是否正在使用--abi=eabi?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有使用eabi。 我使用的是传统的咖啡。
    我的意思是,我不能精确地确定何时发生的确切数值。 在我的应用程序(电机控制)中,我生成一个从0到1的斜坡信号,然后乘以2*PI (即 我有0到6.2.83185307亿),这是sin()函数的输入。 坡道生成器来自controlSUITE (rampgen.h),来自坡道生成器的值符合预期。 正如我所说,我在Delfino上使用了此代码,没有任何问题。 由于Sin的输出偶尔为+INF,因此会混淆以下控制计算,导致PWM占空比不正确。 这就是我第一次注意到这个问题的方式,正如我所说的,没有规律的模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否确定没有零的杂散除? 您能否向我们提供一个表,列出哪些rampgen输出会导致+INF?

    我建议您仅存储最后两个PWM输出,并在sin()为无穷大时进行外推。

    查找表的速度也会快得多。 8^)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的代码中没有任何分区。 我需要使用sin函数,因为值几乎是连续的数据。 编译器中是否有用于检测+INF值的宏?
    每当我在sinf和sin之间切换时,该错误都是可以复制的。 这是否一个由浮子至双倍或反之的抛撒问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在COFF中,float和double都是32位浮点类型。 理论上,sin (x)和sinf (x)应该相同。 RTS2800 FPU库等库将默认的RTS库数学函数(例如sin (x))替换为自己的较快版本。 但是,到目前为止,他们通常只会更换双类型函数(例如,sin (x)),而不是更新的C99函数(例如,sinf (x),sinl (x)))。 可能发生的情况是,您的sin(x)结果来自RTS2800 FPU库替换,而您的sinf(x)结果来自默认的RTS库。 编译器组维护默认的RTS库(rts2800_fpu32.lib)。 由于编译器小组的版本中没有出现该错误,您必须在C2000论坛上提出问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是:

    #define SIM_BLED_UP (ABS > 1.0.0001万)



    #define SIM_is_INF (s == INF)
    可能不起作用,具体取决于操作方式(或是否!) TI编译器将允许您输入无穷大。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 感谢您的意见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    输入到您控制的sin函数变量还是观察者的输出? 如果它是观察者的输出,您很可能在内部有一个部门,如果出现零值,您的输出将转至+-inf. 因为你在控制循环中,其他的一切也会变成+-inf.

    确保您首先捕获任何"零"事件。

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

    不,sin()的输入来自rampgen模块,而不是来自观察者。