请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?
答案:4 悬赏:0
解决时间 2021-01-23 09:10
- 提问者网友:酱爆肉
- 2021-01-23 04:17
请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?
最佳答案
- 二级知识专家网友:话散在刀尖上
- 2021-01-23 05:29
float型数据精度只有 有效数字 6-7 位,所以存放 12345.53231 时,只能精确到 12345.53。
要存放 12345.53231,可以用 double 或 char s[].
double 仍有 10进制到2进制,2进制回10进制的误差问题。
#include
int main(){
double x = 12345.53231;
int a,b;char s[30];
int i;a = (int) x; // a 没问题
b = (x-a) * 100000; // 这里要假定取多少位小数
printf("a=%d b=%d\n",a,b);
sprintf(s,"%15.5lf",x);//用这个方法转字符串。
// 当然最好是一开始声明 char s[30]=“12345.53231”;就不必转化。
sscanf(s,"%d.%d",&a,&b);// 注意 格式里 有个小数点符号
printf("a=%d b=%d\n",a,b);
}
输出:
a=12345 b=53231
a=12345 b=53231
追问:多谢了!单片机的传感器收到数据12345,把它做个数据转换,用到的方法是float 12345/36776.0,然后把float的整数和分数部分分别存放到int型变量b,c中,该怎么做小数部分的误差才最小?有什么好办法?除了强制转换?(因为我确认强制转换会极大降低float精度,即使先*1000000再转换为long型数据,然后%得到某个位数的数字。。。。这样的方法误差也是很大的。。。!!!)
追答:通常,传感器得到的是模拟量,通过A/D转换,得到数字量。
数的精度由A/D转换器硬件决定了 -- 满度值是多少,分辨率是多少。
我估计,你的单片机也就是6-7位十进制的精度。整数部分位数多了,小数部分就少了。
靠计算方法并不能提高测试精度。
在模拟量方面是否可以做点工作,例如调节偏移量(或常说的调零)和放大倍数,使试验数据用到接近满度。另外,把实验结果和传感器器标定(率定)曲线送到PC机上处理。这是从根本上提高精度。
追问:朋友你好,在pc上如何处理?能提高精度?C++?例如收到传感器数据a=12345,满度值是b=32676,然后把a和b数据送到pc处理?精度能达到多少?有代码吗?。另外你说的调零和率定没学过,呵呵,有代码可以发到我扣扣邮箱150116230
追答:调零和率定没学过 -- 那就说来话长了。
满度 32676,分辨率为1, a=12345,所以你的小数部分也就只能1位精度。
传感器 信号 通常是电压,物理量可以格式各样,例如温度,压力,长度,速度,应力,频率等等,电压 到 物理量 的转换 关系,通常是非线性的,它们直接关系通过 率定 得到 (厂方或用户)。电压 到 物理量 的转换 计算,pc 比 单片机 方便。特别是 你的 通道很多时。
例如,我的情况,常有 100 个左右的通道/传感器 数据,一组实验完毕,运行一个批程序,全部结果就出来了(数据表,图形曲线,统计参数等)。pc 不能提高测量精度,但不会减低精度。
追问:哦,明白了我想把传感器返回数据12345除以32576,得到浮点数c,后面跟个单位G(重力加速度),精度和单片机的还是差不多啊,有啥好办法?除非用dobule来计算,精度才高?
追答:是的,要用double。否则 除法 还会带来新的误差。乘法 重力加速度 9.80665 也有纬度误差。
总之,有效数字只有6-7位。
要存放 12345.53231,可以用 double 或 char s[].
double 仍有 10进制到2进制,2进制回10进制的误差问题。
#include
int main(){
double x = 12345.53231;
int a,b;char s[30];
int i;a = (int) x; // a 没问题
b = (x-a) * 100000; // 这里要假定取多少位小数
printf("a=%d b=%d\n",a,b);
sprintf(s,"%15.5lf",x);//用这个方法转字符串。
// 当然最好是一开始声明 char s[30]=“12345.53231”;就不必转化。
sscanf(s,"%d.%d",&a,&b);// 注意 格式里 有个小数点符号
printf("a=%d b=%d\n",a,b);
}
输出:
a=12345 b=53231
a=12345 b=53231
追问:多谢了!单片机的传感器收到数据12345,把它做个数据转换,用到的方法是float 12345/36776.0,然后把float的整数和分数部分分别存放到int型变量b,c中,该怎么做小数部分的误差才最小?有什么好办法?除了强制转换?(因为我确认强制转换会极大降低float精度,即使先*1000000再转换为long型数据,然后%得到某个位数的数字。。。。这样的方法误差也是很大的。。。!!!)
追答:通常,传感器得到的是模拟量,通过A/D转换,得到数字量。
数的精度由A/D转换器硬件决定了 -- 满度值是多少,分辨率是多少。
我估计,你的单片机也就是6-7位十进制的精度。整数部分位数多了,小数部分就少了。
靠计算方法并不能提高测试精度。
在模拟量方面是否可以做点工作,例如调节偏移量(或常说的调零)和放大倍数,使试验数据用到接近满度。另外,把实验结果和传感器器标定(率定)曲线送到PC机上处理。这是从根本上提高精度。
追问:朋友你好,在pc上如何处理?能提高精度?C++?例如收到传感器数据a=12345,满度值是b=32676,然后把a和b数据送到pc处理?精度能达到多少?有代码吗?。另外你说的调零和率定没学过,呵呵,有代码可以发到我扣扣邮箱150116230
追答:调零和率定没学过 -- 那就说来话长了。
满度 32676,分辨率为1, a=12345,所以你的小数部分也就只能1位精度。
传感器 信号 通常是电压,物理量可以格式各样,例如温度,压力,长度,速度,应力,频率等等,电压 到 物理量 的转换 关系,通常是非线性的,它们直接关系通过 率定 得到 (厂方或用户)。电压 到 物理量 的转换 计算,pc 比 单片机 方便。特别是 你的 通道很多时。
例如,我的情况,常有 100 个左右的通道/传感器 数据,一组实验完毕,运行一个批程序,全部结果就出来了(数据表,图形曲线,统计参数等)。pc 不能提高测量精度,但不会减低精度。
追问:哦,明白了我想把传感器返回数据12345除以32576,得到浮点数c,后面跟个单位G(重力加速度),精度和单片机的还是差不多啊,有啥好办法?除非用dobule来计算,精度才高?
追答:是的,要用double。否则 除法 还会带来新的误差。乘法 重力加速度 9.80665 也有纬度误差。
总之,有效数字只有6-7位。
全部回答
- 1楼网友:北方的南先生
- 2021-01-23 08:34
先把整数部分取出来,小数部分嘛,想保留多少位就放大10^n倍就行了
- 2楼网友:逃夭
- 2021-01-23 07:12
首先定义变量 int a,b ; float c,d
然后将c值赋予给a,即a得到c的整数部分
接着用d=c-a,d为c的小数部分
最后确定出你要精确的位数,将d乘以对应的10的N次方,就可以了
追问:不是你想的那么简单的,小数部分的数据会变化的!有误差!
然后将c值赋予给a,即a得到c的整数部分
接着用d=c-a,d为c的小数部分
最后确定出你要精确的位数,将d乘以对应的10的N次方,就可以了
追问:不是你想的那么简单的,小数部分的数据会变化的!有误差!
- 3楼网友:逐風
- 2021-01-23 06:42
这个看精度要求,浮点数本身就不是很精确的。如果要求很精确的分离两者,可以从二进制的定义着手,float型数据定义如下:1bit(符号位) 8bits(指数位) 23bits(尾数位)
可以考虑将其转换为long,再将整数值扣除,从而获得小数
追问:我把小数的小数部分用*10^n来把小数部分也挪移到整数部分,然后转换为long型数据,再用%...来取原小数部分的那些数据串,也不行!还是有误差,而且差小数点后三位的精确度!!!
追答:你的这个n值怎么确定的?
追问:想把小数部分的几位转移到整数部分,n就是几啊!
追答:你把你的源代码贴上来看看
可以考虑将其转换为long,再将整数值扣除,从而获得小数
追问:我把小数的小数部分用*10^n来把小数部分也挪移到整数部分,然后转换为long型数据,再用%...来取原小数部分的那些数据串,也不行!还是有误差,而且差小数点后三位的精确度!!!
追答:你的这个n值怎么确定的?
追问:想把小数部分的几位转移到整数部分,n就是几啊!
追答:你把你的源代码贴上来看看
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯