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 函数。
此致。
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.
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 函数。
此致。
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 一样高效的函数... 相信我、这不是那么简单...
此致
以下是我们的建筑师的建议:
//函数返回 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;
返回重建;
}
所有选项都有某种形式的范围和精度权衡。