导航:首页 > 源码编译 > 编译器对浮点数的处理

编译器对浮点数的处理

发布时间:2022-03-12 15:38:13

㈠ 关于定点DSP实现浮点运算的问题(如果没有Q格式要怎么实现呢)求高手

谁有这方面的资料,针对ccs编译器处理的。

㈡ 请教高手: compaq visual fortran 6.6 的编译器中使用双精度浮点数出现问题



EK = -1.1

改为:

EK = -1.1D0

或者
EK = -1.1_8

既可!

请注意,-1.1 是个常数,常数也有类型。如果单纯的 -1.1,他还是单精度的常数。
而 -1.1D0 或 -1.1_8 才是双精度的常数

㈢ C语言的问题

我用vc6.0编译你的程序输入3000没有问题。你这程序有问题。
在有小数参与运算时,用float型变量,因为给整型变量赋值浮点数,会把小数直接舍掉。输入3127这样的数,肯定结果会丢掉小数那部分。
至于你说输入3000也有问题,我想可能是tc编译器对浮点数参与整型变量运算的处理与VC不同。

㈣ 如何在C++语言中对浮点数进行格式化处理

㈤ 如何在 GCC 中为具有 FPU 的 Cortex M4 启用硬件浮点数学运算

VFP (vector floating-point)
从ARMv5开始,就有可选的 Vector Floating Point (VFP)模块,当然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片)。对于包含NEON的ARM芯片,NEON一般和VFP公用寄存器。
硬浮点Hard-float
编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。
软浮点 Soft-float
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。 现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。
armel和armhf ABI
在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。soft是指所有浮点运算全部在层实现,效率当然不高,会存在不必要的浮点到整数、整数到浮点的转换,只适合于早期没有浮点计算单元的ARM处理器;softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;hard则使用FPU浮点寄存器将函数参数传递给FPU处理。需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。
Soft-float和hard-float的编译选项
在CodeSourcery gcc的编译参数上,使用-mfloat-abi=name来指定浮点运算处理方式。-mfpu=name来指定浮点协处理的类型。可选类型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。使用-mfloat-abi=hard (等价于-mhard-float) -mfpu=vfp来选择编译成硬浮点。使用-mfloat-abi=softfp就能兼容带VFP的硬件以及soft-float的实现,运行时的连接器ld.so会在执行浮点运算时对于运算单元的选择,是直接的硬件调用还是库函数调用,是执行/lib还是/lib/vfp下的libm。-mfloat-abi=soft (等价于-msoft-float)直接调用软浮点实现库。

㈥ 我在用51单片机运算浮点数的乘法时出现以下情况如何解决,编译器为KEIL2,就是乘完后的结果大于65535的...

浮点数本身就有个精度问题
C51的float浮点型只有7位有效数字,符合IEEE-754标准
浮点运算相比整数运算是很费CPU的

如果long也放不下 可以用字符大数的计算方法,不过很麻烦

㈦ C语言问题关于硬币

这个看你用的是什么编译器了和你的平台有关,我用gcc在Linux下运行你的程序没有问题
因为不同编译器对于浮点数的处理是不同的

浮点数在计算机里面不准确

看起来a=1.3时,a=a*100是130.000,但是在计算机里面130.000有可能是129.99999
所以在你的程序里面b变成25,而e变成了0(因为编译器的处理).

这样在后面计算时会导致误差。下面是我的修改,增加了变量g

#include<stdio.h>
int main()
{
float a;
int b,c,d,e,sum;
int g;

sum=0;b=0;c=0;d=0;
printf("请输入价钱 /元\n");
scanf("%f",&a);
a=a*100;
g=a+0.0001;//因为a可能不太精确,所以加上0.0001再取整,不会有很大影响

b=g/5; //改成g

e=g%5;//改成g
c=e/2;
d=e%2;
sum=b+c+d;
printf("硬币最少数:%d\n 5分硬币数量:%d\n 2分硬币数量:%d\n 1分硬币数量:%d\n",sum,b,c,d);
}

㈧ 使用浮点定制指令时,浮点常量在编译时是做单精度还是双精度处理

默认情况下,对于定制指令中的浮点常量在编译时是做单精度处理的,并且浮点运算是通过硬件完成的。可以采用下面的解决方案强制编译器把浮点常量做双精度处理,并且通过软件完成双精度运算。

您可以选择以下方案:

方案1- 修改软件代码,向浮点常量添加后缀“L”,确保这些变量不会被做单精度处理

下表给出了代码,浮点定制指令,精度和实现模式之间的关系

Example Code FP CI Usage Precision Implementation

b= a * 4.67 Yes Single Hardware

b = a * 4.67 No Double Software

b = a * 4.67f Yes Single Hardware

b = a * 4.67f No Single Software

b = a * 4.67L don't care* Double Software

*浮点定制指令的硬件不会用于双精度运算



方案2-手动修改public.mk文件,删除-mcustom-fpu-config选项,用独立的编译选项代替,但不要使用-fsingle-precision-constant选项。


"-mcustom-fpu-config=60-1" 修改为 "-mcustom-fmuls=252 –mcustom-fadds=253 –mcustom-fsubs=254" 或者


"-mcustom-fpu-config=60-2" 修改为 "-mcustom-fmuls=252 –mcustom-fadds=253 –mcustom-fsubs=254 –mcustom-divs=255"


请注意60-1和60-2之间是有区别的,60-1没有-mcustom-divs选项。

㈨ 关于c语言中如何定义浮点数

需要准备的材料分别有:电脑、C语言编译器。

1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。

㈩ 浮点数问题

楼主的问题应该是浮点数在内存中的存储,浮点数有float和double两种。你耐心看看下面的解释就懂了。
任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。
在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
31 30-23 22-0
float 符号位 阶码 尾数
63 62-52 51-0
double 符号位 阶码 尾数
符号位:0表示正,1表示负
阶码:这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023。比如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表示形式为10000010
尾数:有效数字位,即部分二进制位(小数点后面的二进制位),因为规定M的整数部分恒为1,所以这个1就不进行存储了。
下面举例说明:
float型数据125.5转换为标准浮点格式
125二进制表示形式为1111101,小数部分表示为二进制为 1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000
则其二进制表示形式为
0 10000101 11110110000000000000000,则在内存中存放方式为:
00000000 低地址
00000000
11111011
01000010 高地址
而反过来若要根据二进制形式求算浮点数如0 10000101 11110110000000000000000
由于符号为为0,则为正数。阶码为133-127=6,尾数为11110110000000000000000,则其真实尾数为1.1111011。所以其大小为
1.1111011*2^6,将小数点右移6位,得到1111101.1,而1111101的十进制为125,0.1的十进制为1*2^(-1)=0.5,所以其大小为125.5。
同理若将float型数据0.5转换为二进制形式
0.5的二进制形式为0.1,由于规定正数部分必须为1,将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为
0 01111110 00000000000000000000000
由上分析可知float型数据最大表示范围为1.11111111111111111111111*2^127=3.4*10^38
对于double型数据情况类似,只不过其阶码为11位,偏置量为1023,尾数为52位

阅读全文

与编译器对浮点数的处理相关的资料

热点内容
二分查找流程图算法 浏览:683
质量问题的算法 浏览:79
c代码编译吃cpu频率还是核心 浏览:167
pdf签名adobe 浏览:405
在家无聊解压图片 浏览:534
单片机拨打电话 浏览:440
单片机问题解说 浏览:795
我的世界手机版命令方块零重力 浏览:689
解压游戏无广告最新版 浏览:423
如何下载养生堂app 浏览:242
oracle中文乱码java 浏览:937
儿童编程实践课小结 浏览:482
APP是如何实现数据获取的 浏览:522
买车子看什么app 浏览:832
美国单片机 浏览:815
如何在app上架自己的游戏 浏览:463
安卓系统车载导航支持什么格式u盘 浏览:627
天翼云服务器怎么打开端口 浏览:913
如何启用对服务器远程的访问 浏览:779
程序员环境分析 浏览:820