完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好!
本人是DSP的初学者,目前在项目中遇到一个8次函数的计算问题,是一个1元最高8次(内涵全部0~8次)的累加运算,里面的常量据很大,超过32位,并且确定计算结果肯定在32位之内,结果不会溢出,floa肯定t够用。 目前采用了两种方式实现,第一种是调用pow(a,b)函数,完成8次方到0次方的累加,是双精度的肯定够用,最后赋值保存成float,计算的结果正常。 第二种方式是直接根据公式直接计算,只一个公式多次相乘并相加的型式,中间没有数据类型的转换,最后赋值保存成float,计算的结果正常且与方式一结果相同。 目前有两个问题,第一个问题是,方式二中的一些常数貌似已经超过了32位float的范围,也没有类型转换但是结果是正确的,没有溢出的现象。 第二个问题是我用反正器试运行计算了这两种方式的运行周期,同样是完成5组运算,第一种方式反而很慢,需要100000个运行周期都快到1ms了,可是第二种只需要40多个运行周期速度快的惊人! 不知道什么原因,感觉既然DSP的math里提供了pow(a,b)函数,自然是很有优势的,可是为什么速度反而很慢? 相比以上两种方式的运行时间当然越快越好,但是第一种方式的时间也是能接受的,目前不知道调用pow(a,b)函数的优势在哪里?还有就是第二种直接计算的风险是什么?会不会出现常数在运算中的溢出导致错误? 期待大家能给我留言帮助我,谢谢! |
|
相关推荐
8 个讨论
|
|
60user128 发表于 2018-9-11 14:31 您好! 感谢您的回复,我是要计算y = a1*x^8 + a2*x^7 + a3*x^6 + …… + a9;这么一个多项式,一共是5个这种公式,利用CCS的仿真,加入2个断点,第一个公式前加断点,第五个计算完成后加另一个断点,以此记录了以上时间。 调用pow()函数 y = a1 * pow(x,8) + a2 * pow(x,7) + …… + a9;这种计算的时间很长,反而是直接计算例如逐个提出x利用括号提取的方式,或者干脆直接 y = a1 * x * x * x * x * x * x * x * x ……的方式都要比调用pow()函数的方式快,而且快了很多! 以上的几种计算方式结果都相同正确,因此我疑问pow()函数带来的优势,而且为什么math提供的函数会比简单计算来的慢呢? |
|
|
|
|
|
|
|
Jayden888 发表于 2018-9-11 14:36 你的X是怎么定义的,如果定义为int类型,或者直接写了个整数,那么y = a1 * x * x * x * x * x * x * x * x 这样的式子,肯定是按整数计算的,你前面提到float,那也就是float而已,会比int慢。而pow函数,我记得参数那里的定义是double,也就是说,不管你传递什么数给他,他都按double来算,如果double真的按64位定义的话,那就不是28035的事了,哪怕是long long的64位整形,也明显比32位慢很多。 |
|
|
|
|
|
|
|
60user128 发表于 2018-9-11 14:54 感谢您的再次回复! 您说的很有道理,我的变量x定义的全部都是float浮点型,pow()函数也的确强制成了double型! 那我现在能不能这样理解,在我以上的几种计算方式里面实际影响运算速度的关键在于数据类型了? 我现在用的芯片是28335,运算float的速度一定比定点的DSP快,所以运算的纠结在于数据类型和pow()函数的计算方式关系不大? 也 不知我上面的理解对不对? |
|
|
|
|
|
|
|
Jayden888 发表于 2018-9-11 15:13 一方面是函数调用的开销,可能更多的还是数据类型问题吧。float类型的范围很大,只是精度差而已,好像是10的100多次方那么大,你能把他弄溢出? 对了,你那样写,指数都是整数,而在Pow的参数中,指数可以是小数,不知对于电脑来说,小数指数是否很复杂,但是对我们人类来说,小数的指数比整数复杂不知多少倍~如果我这个猜测成立的话,那所有整数的指数都不应该用pow函数。 |
|
|
|
|
|
|
|
60user128 发表于 2018-9-11 15:27 感谢您的再次回复! float类型的范围很大,你说的对,之前是我弄错了,谢谢! 不管怎么写程序,我的指数部分都是小数呀,只是调用函数里面的指数强制成了double! 您之前的答案我都理解了,非常感谢,那么我现在又有一个延伸的问题,那就是pow()函数本身的好处在哪里?适合什么样的运算呢? |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
549 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1513 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1337 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1756浏览 29评论
2781浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1723浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:22 , Processed in 0.990100 second(s), Total 73, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2048