经下面代码测试,发现浮点数转整型数时并没有使用舍入规则,而是直接抛弃小数部分;
但浮点数打印指定位小数时会采用向偶数舍入规则。
void test_float(void)
{
printf("_float_to_int: %d,%d,%d\r\n",(int32_t)1.40,(int32_t)1.60,(int32_t)1.50);
printf("_float_: %.2f,%.2f,%.2f,%.2f,%.2f\r\n",1.429999,1.639999,1.2350001,2.505,-1.506);
}
《深入理解计算机系统》 2.4.6 C语言中的浮点数
参考C语言浮点数运算_ifreecoding_新浪博客
由上图可以看出,float型不能表示1.0000006这个数。而对于很大的数1234567890,它的二进制是0x4E932C06,实际的浮点数值是1234567936,也是高7位对得上。所以6位有效位数是比较精确的一个定义。
错误示例:
void func(float d1, float d2)
{
if(d1 == d2)
{
;
}
}
正确示例:
#define LIMIT 1.0e-4
void func(float d1, float d2)
{
float diff = d1-d2;
if(-LIMIT <= diff && diff <= LIMIT)
{
;
}
}
错误示例:
void func()
{
double d;
for(d = 0.0; d < 1.0; d += 0.1)
{}
}
正确示例:
#define LIMIT 1.0e-4
void func()
{
int d;
for(d = 0; d < 10; d++)
{}
}
错误示例:
void func()
{
int i1, i2;
double d;
d = i1 / i2;
}
正确示例:
void func()
{
int i1, i2;
double d;
d = (double)i1 / (double)i2;
}
示例:
#define F1 3.2F //float型常量数值
#define D1 3.2 //double型常量数值
void fun()
{
float f;
double d;
f = 1.2f * 3.1f;
d = 1.2 * 3.1;
}
《Cortex-m3和M4权威指南》
参考漫谈计算机组成原理(九)定点数及定点数的运算 - 言立慧 - 博客园
《计算机组成原理》-唐塑飞
什么是定点数? 小数点位置固定的数。比如,整型数。
定点数的位移,加减乘除如何实现? 其实就是整型数的位移,加减乘除运算法则。
结论:所以概括来说,定点数运算就是常用的整型数运算。
其实就是使用整型运算代替浮点运算。
举个例子:
void fun()
{
uint16_t adc_value = 0;
adc_value = 1024; // 浮点数运算
float f_v = 0.0;
f_v = (float)adc_value / 4095 * 3.3; //整型数运算(定点数运算)
uint32_t i_v = 0;
i_v = adc_value * 1000 / 4095 * 33 / 10;
}