作者 | 主题 |
---|---|
锋言锋语 至圣 经验值: 23511 发帖数: 3323 精华帖: 51 |
楼主 2020-09-20 15:56:00
主题:浮点数累积处理方法分享 有人说浮点数累计是一个工人的难题, 这个, 由于先天不足, 这个问题确实存在。但是, 为什么不避开这个问题呢? 长话短说, 思路如下: 浮点数float累计, 可以另存整取, 转化为整数累计, 一个DWORD, 可以存储40亿,大多数场合已经足够。如果遇到变态的需求,比如手要求20位有整数数字, 这个方法放后面来说: 简单来说, 就是另存整取。 如果当前累计变量大于1, 就把整数部分提取到 整数计数器中, 小数部分单独计算, 可以设置个阈值, 小数部分累计大于多少时, 提出整数,剩下的继续累积。我用c语言表示如下: void Sum(float v, int *psumInt, float *ptail, int lv) { int a = floor(v); // 取出整数部分; float t = *ptail; *psumInt += a; t += (v - a);
if(t > lv) //大于阈值 { a = floor(t); *psumInt += a; *ptail = t - a; } } 上位机显示时, 可以脚本显示, 直接转换成字符串, 不丢失精度, 如果嫌麻烦, 可以plc直接求和。 2.再说变态需求, 比如20位精度,小数部分处理同上, 整数部分, 可以自己实现一个 增强型加法器,程序如下, c语言实现, 仅供参考 #include <stdio.h> int p[5] = { 0}; //每个int存放四位十进制小数;4 * 5 = 20; void LargeAdd(int *p, int v) //简单示意, 没考虑内存安全, 和v>MaxInt; { int i = 0; p[0] += v; //低四位相加
for(i = 0; i != 4; ++i) //最高的不再进位, 默认不超过20位 { if(p[i] >= 10000) //加法进位, 小学知识 {
p[i + 1] += p[i] / 10000; //整除 p[i] %= 10000; //求余 } } } int main() { for(int i = 1; i <= 2000; ++i) {
LargeAdd(p, i);
printf("%d: ", i); for(int j = 0; j != 5; ++j) { printf("%04d", p[4 - j]);
} printf("\n"); }
} 如上, 任意位数的累加都可以实现; 所以, 也许浮点数累加有问题, 但是累加绝无问题。 办法总比困难多。
不忘初心
|
zhangli0 至圣 经验值: 42649 发帖数: 15628 精华帖: 61 |
2楼 2020-09-20 17:49:55
主题:回复:浮点数累积处理方法分享 你是很喜欢hmi上搞这些东西呀!hmi本身的工作很多,能用plc解决的,就不要用wincc了,wincc很累。这种算法plc中解决的说明已经很多了。
活到老,学到老!为了生活学习吧!
|
zhangli0 至圣 经验值: 42649 发帖数: 15628 精华帖: 61 |
3楼 2020-09-20 17:55:27
主题:回复:浮点数累积处理方法分享 http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_id=43844&cid=1029 http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=89047&cid=1029 还有很多就不列举了。
活到老,学到老!为了生活学习吧!
|
锋言锋语 至圣 经验值: 23511 发帖数: 3323 精华帖: 51 |
4楼 2020-09-21 07:08:13
主题:回复:浮点数累积处理方法分享 @zhangli0版主, 我说的是如何实现高精度累加,避免浮点大树加小数丢失数据, 不是说简单积分的问题。 而且, 用c语言表示, 不一定是说非得坐在上位机。 我喜欢用c来表达算法, 简单直接。 关于累加, 总逃不掉积分二字。 稍微用点心就该明白原理。 这里不讨论积分, 讨论的是高精度累加。
不忘初心
|
万泉河 至圣 经验值: 28634 发帖数: 10885 精华帖: 131 |
5楼 2020-09-21 08:12:05
主题:回复:浮点数累积处理方法分享 这是落后的思想。 哪里有什么整数和小数? 理工科的眼里, 所有物理值都应该是科学计数法。 只有一位整数+小数,以及指数。 而事实上计算机里面浮点数的表达方式也是科学计数法表示的。 你这么硬要区分整数加小数, 那遇到根本没有小数全是整数的测量值,怎么算?或者遇到量纲极大, 有效数值在小数点后十几位的怎么算?
微信公众号:PLC标准化编程,ZHO6371995
|
kibu 侠圣 经验值: 4500 发帖数: 554 精华帖: 4 |
6楼 2020-09-21 08:38:51
主题:回复:浮点数累积处理方法分享 科学计数法足矣 |
黑猫警长W 至圣 经验值: 18280 发帖数: 2393 精华帖: 1 |
7楼 2020-09-21 09:42:44
主题:回复:浮点数累积处理方法分享 |
shine 至圣 经验值: 19949 发帖数: 8944 精华帖: 39 |
9楼 2020-09-21 10:59:41
主题:回复:浮点数累积处理方法分享 如果有双精度数,一般来说就够用了。 如果没有,只有单精度,那我直接用整数进行累计,多几个级联,一个整数表示10000,两个就能表示1e8,3个表示1e12,最后显示的时候再转成浮点数 |