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 bits 32-bit IEEE single-precision 4
double 64 bits 64-bit IEEE double-precision 8
long double 64 bits 64-bit IEEE 8
fract16 16 bits signed 1.15 fract 2
fract32 32 bits signed 1.31 fract 4

其中前4个采用了IEEE的格式,而fract则是ADI自己定义的格式。

在这里容易混淆的一点是通过project options -> compilers中的参数配置可以控制使用的double类型是32位的还是64位的,可恶的是在默认情况下,vdsp是将double当成32位来处理的,这对于某些科学计算相关的代码来说简直是一个噩梦!

当然了,由于bf561硬件本身不支持浮点运算,只能通过软件模拟来实现,所以文档中这样解释为什么默认情况下要使用32位的double:

On Blackfin processors, the float data type is 32 bits, and the double data type default size is 32 bits. This size is chosen because it is the most efficient. The 64-bit long double data type is available if more precision is needed, although this is more costly because the type exceeds the data sizes supported natively by hardware.

似乎勉强也说得过去。

但由此造成的一个问题是:如果在要使用的dlb库和调用者之间是使用不同的选项来编译的,那么将造成程序运行时不可避免的错误!

时间: 2024-12-31 02:15:18

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

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)中的浮点运算(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)中的浮点运算(2):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 = 0 Mantissa =

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

fract16是VDSP的另一种浮点类型,它使用1.15的格式: 最高位为符号位,其余为数据位,没有指数和尾数的概念. 最大值:+0.999969482421875 最小值:-1 分辨率:2-15 = 0.000030517578125 在blackfin里面使用fract类型进行计算可以获得最好的性能,但是要求在使用之前对需要进行计算的数据进行归一化,而且必须保证在计算过程中不会产生溢出. 在对数据归一化的时候,通常是需要进行浮点计算的,因此要产生很多额外的开销,如果使用fract进行的计算量

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)中的浮点运算(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 分辨

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中,先看看它的注释: /*************************************************