请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?

问题描述:

请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?
例:12345.53231,如何把整数部分存在int a 里,且a==12345?把小数存在变量int b里,且b==53231?(误差在+-2以内就行!)
1个回答 分类:综合 2014-09-25

问题解答:

我来补答
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位。
 
 
展开全文阅读
剩余:2000
上一页:这一步看不懂
下一页:这题详细解释