Vdsp(bf561)中的浮点运算(10):fract16类型表示

fract16是VDSP的另一种浮点类型,它使用1.15的格式:


最高位为符号位,其余为数据位,没有指数和尾数的概念。

最大值:+0.999969482421875

最小值:-1

分辨率:2-15 = 0.000030517578125

在blackfin里面使用fract类型进行计算可以获得最好的性能,但是要求在使用之前对需要进行计算的数据进行归一化,而且必须保证在计算过程中不会产生溢出。

在对数据归一化的时候,通常是需要进行浮点计算的,因此要产生很多额外的开销,如果使用fract进行的计算量小于归一化的计算量,那就没有必要使用它。比如vdsp文档里面提及的那个例子:

时间: 2024-09-29 13:00:27

Vdsp(bf561)中的浮点运算(10):fract16类型表示的相关文章

Vdsp(bf561)中的浮点运算(15):vdsp库的一个BUG

在写完fract除法之后,偶然发现在vdsp的一个头文件中提供了fract16除法运算的函数,这个文件就是VisualDSP 5.0\Blackfin\include\fract_math.h: /* Produces a result which is the fractional division of f1 by f2. Not a builtin * as written in C code. */ #pragma inline #pragma always_inline static

Vdsp(bf561)中的浮点运算(16):fract2x16类型

由于BF561内部带有两个16位的MAC,因此它将可以在一个周期内进行两个fract16类型的运算. 为适应这种特性,vdsp引入了一个称之为fract2x16的类型.它其实是定义为一个int类型的整数,但是其实际意义却是要用高低16位分别来表示两个fract16类型. typedef int _raw32; typedef _raw32 raw2x16; typedef raw2x16 fract2x16; 要查看fract2x16类型的值还是只能通过data register窗口,手动将类型

Vdsp(bf561)中的浮点运算(11):fract16与float的转换

vdsp提供了两个函数用以实现fract16与float之间的相互转换: fract16 float_to_fr16 (float _x); float fr16_to_float (fract16 _x); 看看这两个转换函数到底做了什么. 1.1 float_to_fr16 这个函数的原始代码在Blackfin\lib\src\libc\runtime\fl2fr.asm中,先看看它的注释: /*************************************************

Vdsp(bf561)中的浮点运算(14):fract16除法

原来指望能够有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; in

Vdsp(bf561)中的浮点运算(13):fract16乘法运算

vdsp提供了三种不同的方式进行fract16的乘法运算. 1.1 mult_fr1x16函数 这个函数定义为: #pragma inline #pragma always_inline static fract16 mult_fr1x16(fract16 __a, fract16 __b) { fract16 __rval = __builtin_mult_fr1x16(__a, __b); return __rval; } 从这里可以看出我们实际可以使用__builtin_mult_fr1x

Vdsp(bf561)中的浮点运算(12):fract16加减运算

由于减法实际可以看成加上一个负数,因此我们只需要看加法操作.fract16的加法运算由add_fr1x16函数完成: #pragma inline #pragma always_inline static fract16 add_fr1x16(fract16 __a, fract16 __b) { fract16 __rval = __builtin_add_fr1x16(__a, __b); return __rval; } 从这里可以看出我们实际可以使用__builtin_add_fr1x1

Vdsp(bf561)中的浮点运算(5):float类型表示总结

1.1 float的疑问 写一行很简单的C代码: float a = 1234.56; 用vdsp编译后的汇编代码为: R0 = 20972 ( X ) ; R0.H = 17562 ; [ FP + 0x10 ] = R0 ; 有点看不懂,呵呵,R0的值转换为十六进制就是0x449A51EC.根据vdsp文档的说法,其单精度浮点数格式为: 浮点数计算公式: 将0x449A51EC转换为二进制: 0100 0100 1001 1010 0101 0001 1110 1100 可得: Sign =

Vdsp(bf561)中的浮点运算(1):文档的说法

在vdsp提供的<VisualDSP++ 5.0 C/C++ Compiler and Library Manual for Blackfin Processors Revision 5.1, August 2008>中列出了vdsp支持的所有数据类型,其中与浮点有点的类型有: Type Bit Size Number Representation sizeof returns double 32 bits 32-bit IEEE single-precision 4 float 32 bit

Vdsp(bf561)中的浮点运算(9):long double和float的比较

在默认情况下,vdsp认为double和float这两种类型是一样的,因此我们比较long double和float. 1.1 类型表示 下面是两种类型的数据表示:   float long double 字节数 4 8 符号位 1 1 指数位数 8 11 尾数位数 23 52 最小值 1.1754943508222875E-38F 2.2250738585072014E-308L 最大值 3.4028234663852886E+38F 1.797693134862315708E+308L 分辨