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.

[参考译文] TMS320F280049:CLA 的 fmodf 函数等效项

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1326137/tms320f280049-fmodf-function-equivalant-for-cla

器件型号:TMS320F280049

HY,

是否可以使用 CLA 的(float32_t) fmodf (float32_t a、float32_t b)函数(int math.h library)的等效值?

例如、fmodf (10.5f、3.2f)= 0.9f、CPU 上具有 math.h 函数。

此致。

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

    您好!

    由于美国放假、请预计在2月20日前收到答复。

    谢谢。此致、

    辛奇塔

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

    Frank:

    实现 fmodf (a、b)的一种有效方法是 a -(int)(a/b) x b

    这已在 C2000端实现、在 fp_mode=relaxed 时、使用 TMU 除法指令、因此可以加快计算速度。

    在 CLA 上也可以采用类似的方法。 您可以 在 CLAmath.h 中将 division /替换为 clAdiv_inline()以实现高效实现。

    您可以创建一个内联函数,如 CLAfmodf_inline(),并将其放在 CLAmath.h 中。

    谢谢。

    Sira

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

    Hy Sira,

    我已经尝试过这个解决方案,但为了时间效率目的,我必须保持 fp_mode=strict 和:

     -首先, int32最大值(同为负)比 float32最大值小得多,所以当 a 比 b 高得多时,这不起作用,

     -其次,即使 a/b 低于 int32最大值,它也会很快失去精度(尝试 fmodf(25000.0f,2.0*M_pi)和 math.h 函数和 a -(int)(a/b) x b ,你会看到差异)。

    我需要一个无论 a 和 b 值是多少都与 fmodf 一样高效的函数... 相信我、这不是那么简单...

    此致

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

    Frank:

    你提出了一些有趣的观点,让我更深入地探讨这一点,并回到你。

    谢谢。

    Sira

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

    Frank:

    对此延迟深表歉意。 我已就此与一些主题专家取得联系。

    我想 a/b 可以超过 int32_t 范围、就如您所说。

    即使我们将 int32_t 替换为 long long 类型(或 a/b 在 int32_t 范围内)、我们也无法获得必要的精度?

    您能否提供以上特定测试用例的结果?

    谢谢。

    Sira

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

    以下是我们的建筑师的建议:

    //函数返回 a/b 的 f32余数

    float return_float_remainder (float a、float b){

     

       浮点值;

       浮点 i、f、retval;

     

       /*分配我们将计算 modf 的值*/

       value = a/b;//进行浮点除法。 在较新的 C28器件上、我们有硬件加速器来执行此操作。 在较旧的版本上、我们可以使用 TMU、

     

       /*计算返回小数部分和积分部分的值的 modf */

       f = modf (value、&I);

        //我们在 C28 FPU 中有一条 FRACF32指令来获得小数部分。 我们不必使用库函数 modf、但可以使用 FRACF32来获得小数部分。

    // CLA 也有 mfracf32内在函数

     

      RetVal = f*b;

      返回重建;

    所有选项都有某种形式的范围和精度权衡。