<b>Vdsp(bf561)中的浮点运算(14):fract16除法</b>[VC/C++编程]
本文“<b>Vdsp(bf561)中的浮点运算(14):fract16除法</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本来期望可以有div_fr1x16之类的函数来实现fract16的除法,但是很遗憾vdsp竟然不直接供应这样的函数,让人颇为尴尬,预计是因为其CPU不直接供应fract除法的来由.不过vdsp文档里面供应了一个做除法的例子:
fract16 saturating_fract_divide(fract16 nom, fract16 denom)
{
int partialres = (int)nom;
int divisor = (int)denom;
fract16 rtn;
int i;
int aq; /* initial value irrelevant */
if (partialres == 0) {
/* 0/anything gives 0 */
rtn = 0;
} else if (partialres >= divisor) {
/* fract16 values have the range -1.0 <= x < +1.0, */
/* so our result cannot be as high as 1.0. */
/* Therefore, for x/y, if x is larger than y, */
/* saturate the result to positive maximum. */
rtn = 0x7fff;
} else {
/* nom is a 16-bit fractional value, so move */
/* the 16 bits to the top of partialres. */
/* (promote fract16 to fract32) */
partialres <<= 16;
/* initialize sign bit and AQ, via divs(). */
partialres = divs(partialres, divisor, &aq);
/* Update each of the value bits of the partial result */
/* and reset AQ via divq(). */
for (i=0; i<15; i++) {
partialres = divq(partialres, divisor, &aq);
}
rtn = (fract16) partialres;
}
return rtn;
}
这个计算历程在不翻开优化的情形下将需求500个cycle,在翻开优化之后将只需求42个cycle!相对比于将fract16转换为float举行计算还是要快得多.
以上是“<b>Vdsp(bf561)中的浮点运算(14):fract16除法</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |