文章目录
- 一、遇到的问题
- 二、解决方案
- 三、问题根因
- float和double的区别:
- 总结-浮点数
一、遇到的问题
将NXP项目的代码移植到RH850F1K的项目上时,程序运行异常:
u16Volt = (uint16)((double)u16ADVal * (double)6.3)
执行到这一行程序就跑飞了……
二、解决方案
①u16Volt = (uint16)((float)u16ADVal * (float)6.3)
②u16Volt = (uint16)(u16ADVal * 630 /100)——推荐使用
三、问题根因
RH850 F1K仅支持单精度浮点型运算
float和double的区别:
①float:单精度浮点数;double:双精度浮点数
②在内存中占有的字节数不同:单精度浮点数在单片机内存中占4个字节;双精度浮点数在单片机内存中占8个字节;
③有效数字位数不同:单精度浮点数有效数字8位;双精度浮点数有效数字16位;
④数值取值范围不同:单精度浮点数的表示范围:-3.40E+38~3.40E+38; 双精度浮点数的表示范围:-1.79E+308 ~1.79E+308;
⑤在程序中处理速度不同:一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
⑥如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转。
float a = 1.23; //error,编译报错
float a = (float)1.23; //定义单精度浮点型变量
float f = 1.23f; // 定义单精度浮点型变量
double d = 1.23; // 定义双精度浮点型变量,可以不加"d"或"D"后缀
总结-浮点数
单精度浮点float:可以精确到小数点后6位
双精度浮点double:可以精确到小数点后12位
提示:
C可以通过f或F后缀是编译器把浮点常量当做float类型,比如2.3f和9.11E9F。
l或L后缀使一个数字成为long double类型,比如54.3l和4.32e4L。建议使用L后缀,因为字母l和数字1容易混淆
没有后缀的浮点常量为double类型。例:sizeof(1.9) = 8;
浮点二进制转换工具