l*******c 发帖数: 523 | 1 如果有个t的函数:
V(t) = sqrt { (Va)^2 + [(Vb)^2 - (Va)^2]*[1-e^(kt/20)]/(1-e^T)};
Va是已知的值;
Vb也是已知的值;
T是常数。
然后k从1到20,有没有简单的算法可以减少for循环里运算量?以下是那段code:
if (Vb > Va)
deltaDAC = (Vb * Vb - Va * Va)/(1-exp(T));
else
deltaDAC = (Va * Va - Vb * Vb)/(1-exp(T));
if (Vb > Va)
{
for (k=1; k <= 20; k++)
{
Data1 = Va * Va;
Data2 = deltaDAC * (1-exp(k/20));
DAC_Set_Value = sqrt(Data1 + Data2);
DAC_Output(DAC_Set_Value, Dir);
Delay_us(DelayTime);
} |
c****p 发帖数: 6474 | 2 循环里面的Data1可以拿出来吧。
【在 l*******c 的大作中提到】 : 如果有个t的函数: : V(t) = sqrt { (Va)^2 + [(Vb)^2 - (Va)^2]*[1-e^(kt/20)]/(1-e^T)}; : Va是已知的值; : Vb也是已知的值; : T是常数。 : 然后k从1到20,有没有简单的算法可以减少for循环里运算量?以下是那段code: : if (Vb > Va) : deltaDAC = (Vb * Vb - Va * Va)/(1-exp(T)); : else : deltaDAC = (Va * Va - Vb * Vb)/(1-exp(T));
|
m*****e 发帖数: 15 | |
c***r 发帖数: 1570 | 4 no t?
---Data2 = deltaDAC * (1-exp(k/20)); |
z**********6 发帖数: 68 | 5 1: data1 能拿出来,楼上已经说了
2: 那个exp不用每次都做,exp(k/20)你可以在循环外算出来exp(1/20), 假设它等于x
,那么Data2 = deltaDAC * (1-x^k),每次记住x^k更新x^(k+1)的时候乘一个x就行了,
一个乘法换一个指数运算加一个除法。
不过话说回来除非你这个小循环在一个更大的循环里面,不然其实这么搞也快不了多少
,一般数学库的exp其实已经挺快的了 |