技术论坛

浮点数累积处理方法分享

作者 主题
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
主题:【分享】浮点数累积处理方法分享
推荐帖


只看楼主 楼主 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");

}


}

如上, 任意位数的累加都可以实现;


所以, 也许浮点数累加有问题, 但是累加绝无问题。 办法总比困难多。 


不忘初心
分享帖版主置评: 你的这种算法有版主在plc的版区已经说过了,能用plc算的尽量不要用hmi了,hmi很累了。 (推荐人:zhangli0)
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1643251&b_id=5&s_id=0&num=28

版主

经验值: 43587
发帖数: 15780
精华帖: 61
回复:浮点数累积处理方法分享
推荐帖


只看楼主 2楼 2020-09-20 17:49:55

你是很喜欢hmi上搞这些东西呀!hmi本身的工作很多,能用plc解决的,就不要用wincc了,wincc很累。这种算法plc中解决的说明已经很多了。


活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
版主

经验值: 43587
发帖数: 15780
精华帖: 61
回复:浮点数累积处理方法分享
推荐帖


只看楼主 3楼 2020-09-20 17:55:27
活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
回复:浮点数累积处理方法分享
推荐帖


只看楼主 楼主 4楼 2020-09-21 07:08:13

@zhangli0版主, 我说的是如何实现高精度累加,避免浮点大树加小数丢失数据, 不是说简单积分的问题。

而且, 用c语言表示, 不一定是说非得坐在上位机。  我喜欢用c来表达算法, 简单直接。

关于累加, 总逃不掉积分二字。 稍微用点心就该明白原理。 这里不讨论积分, 讨论的是高精度累加。


不忘初心
以下网友喜欢您的帖子:

  
至圣

经验值: 28599
发帖数: 10824
精华帖: 131
回复:浮点数累积处理方法分享
推荐帖


只看楼主 5楼 2020-09-21 08:12:05

这是落后的思想。 

哪里有什么整数和小数?


理工科的眼里, 所有物理值都应该是科学计数法。 只有一位整数+小数,以及指数。


而事实上计算机里面浮点数的表达方式也是科学计数法表示的。 


你这么硬要区分整数加小数, 那遇到根本没有小数全是整数的测量值,怎么算?或者遇到量纲极大, 有效数值在小数点后十几位的怎么算?




微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
侠圣

经验值: 4521
发帖数: 554
精华帖: 4
回复:浮点数累积处理方法分享
推荐帖


只看楼主 6楼 2020-09-21 08:38:51
以下是引用万泉河在2020-09-21 08:12:05的发言 >5楼

这是落后的思想。 

哪里有什么整数和小数?


理工科的眼里, 所有物理值都应该是科学计数法。 只有一位整数+小数,以及指数。


而事实上计算机里面浮点数的表达方式也是科学计数法表示的。 


你这么硬要区分整数加小数, 那遇到根本没有小数全是整数的测量值,怎么算?或者遇到量纲极大, 有效数值在小数点后十几位的怎么算?



科学计数法足矣


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18407
发帖数: 2409
精华帖: 1
回复:浮点数累积处理方法分享
推荐帖


只看楼主 7楼 2020-09-21 09:42:44


感谢分享哦


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18898
发帖数: 2108
精华帖: 0
回复:浮点数累积处理方法分享


只看楼主 8楼 2020-09-21 10:52:14

应用领域不同,各有用途


 
以下网友喜欢您的帖子:

  
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
回复:浮点数累积处理方法分享
推荐帖


只看楼主 9楼 2020-09-21 10:59:41

如果有双精度数,一般来说就够用了。

如果没有,只有单精度,那我直接用整数进行累计,多几个级联,一个整数表示10000,两个就能表示1e8,3个表示1e12,最后显示的时候再转成浮点数


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 6136
发帖数: 706
精华帖: 2
回复:浮点数累积处理方法分享


只看楼主 10楼 2020-09-21 11:04:46


好好学习饿!!!


《图解数控机床维修必备技能与实战速成》《实用数控加工手册》《车辆轮轴加工与组装》
以下网友喜欢您的帖子:

  
游士

经验值: 277
发帖数: 26
精华帖: 0
回复:浮点数累积处理方法分享


只看楼主 11楼 2020-09-21 13:01:38


好好学习吧!现在连浮点数取整都整不明白。


加油吧!
以下网友喜欢您的帖子:

  
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
回复:浮点数累积处理方法分享


只看楼主 楼主 12楼 2020-09-21 13:07:22
以下是引用万泉河在2020-09-21 08:12:05的发言 >5楼

这是落后的思想。 

哪里有什么整数和小数?


理工科的眼里, 所有物理值都应该是科学计数法。 只有一位整数+小数,以及指数。


而事实上计算机里面浮点数的表达方式也是科学计数法表示的。 


你这么硬要区分整数加小数, 那遇到根本没有小数全是整数的测量值,怎么算?或者遇到量纲极大, 有效数值在小数点后十几位的怎么算?



万版主跑偏了, 我们讨论的是高精度累加, 不是其他什么。


不忘初心
以下网友喜欢您的帖子:

  
至圣

经验值: 28599
发帖数: 10824
精华帖: 131
回复:浮点数累积处理方法分享


只看楼主 14楼 2020-09-21 20:17:47
以下是引用锋言锋语在2020-09-21 13:07:22的发言 >

万版主跑偏了, 我们讨论的是高精度累加, 不是其他什么。

你连小数点的位置都不能确定, 怎么跑偏了


微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
至圣

经验值: 10581
发帖数: 1796
精华帖: 0
回复:浮点数累积处理方法分享


只看楼主 15楼 2020-09-21 20:49:50



跟着大家学习,值得。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
回复:浮点数累积处理方法分享


只看楼主 楼主 16楼 2020-09-22 08:48:13
以下是引用万泉河在2020-09-21 20:17:47的发言 >14楼

你连小数点的位置都不能确定, 怎么跑偏了

以下是引用锋言锋语在2020-09-21 13:07:22的发言 >:万版主跑偏了, 我们...

引用详细内容:

万版主跑偏了, 我们讨论的是高精度累加, 不是其他什么。

我不知道你说这个什么意思 ? 有点不知所云。


我不知道你是不是在说我不知道浮点数的格式。

本帖子在讨论高精度累加, 至于浮点数的原理, 我想知道的人不在少数。  请分清主题。 否则我说东,你说西, 先不说谁对谁错, 这样大家费这劲发帖图啥呢?


不忘初心
以下网友喜欢您的帖子:

  
至圣

经验值: 28599
发帖数: 10824
精华帖: 131
回复:浮点数累积处理方法分享


只看楼主 17楼 2020-09-22 09:02:32
以下是引用锋言锋语在2020-09-22 08:48:13的发言 >

我不知道你说这个什么意思 ? 有点不知所云。


我不知道你是不是在说我不知道浮点数的格式。

本帖子在讨论高精度累加, 至于浮点数的原理, 我想知道的人不在少数。  请分清主题。 否则我说东,你说西, 先不说谁对谁错, 这样大家费这劲发帖图啥呢?

你确实是不知所云。 


你做一个标准块的时候, 实现并不知道来的这个浮点数的小数点在什么位置。 是有1位小数,还是3位小数,整数部分有几位?会不会来的数值压根就在小数点后5-6位?从科学计数来说指数部分是负值?


你总不能说,具体问题具体分析, 遇到啥变量再定吧?


这就是我说的你不知道小数点的位置。 大家都不知道。 


不知道小数点位置的情况下, 一厢情愿的切分整数和小数。



微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
回复:浮点数累积处理方法分享


只看楼主 楼主 18楼 2020-09-22 09:23:32
以下是引用万泉河在2020-09-22 09:02:32的发言 >17楼

你确实是不知所云。 


你做一个标准块的时候, 实现并不知道来的这个浮点数的小数点在什么位置。 是有1位小数,还是3位小数,整数部分有几位?会不会来的数值压根就在小数点后5-6位?从科学计数来说指数部分是负值?


你总不能说,具体问题具体分析, 遇到啥变量再定吧?


这就是我说的你不知道小数点的位置。 大家都不知道。 


不知道小数点位置的情况下, 一厢情愿的切分整数和小数。


以下是引用锋言锋语在2020-09-22 08:48:13的发言 >:我不知道你说这个什...

引用详细内容:

我不知道你说这个什么意思 ? 有点不知所云。


我不知道你是不是在说我不知道浮点数的格式。

本帖子在讨论高精度累加, 至于浮点数的原理, 我想知道的人不在少数。  请分清主题。 否则我说东,你说西, 先不说谁对谁错, 这样大家费这劲发帖图啥呢?

这个我同意。 


那我的帖子做些修正:


就是输入在合理范围内的高精度累加, 比如正常情况下, 变送器到plc的, 由于16位整数转换, 本身就有个最小分辨率, 会滤除过小的值。 再加上必要的逻辑处理, 比如小流量切除之类的。 这种前提下, 高精度累计没有问题。


实际上,如果不考虑上述条件, 强行分开小数和整数, 虽然理论上没有问题, 但是小数部分累加,仍然会丢失精度。


不忘初心
以下网友喜欢您的帖子:

  
版主

经验值: 43587
发帖数: 15780
精华帖: 61
回复:浮点数累积处理方法分享


只看楼主 19楼 2020-09-22 10:28:59

32位无符号整数表示的范围是0~4 294 967 295,32位实数表示的范围是±3.4e38,很明显实数比整数表示的范围大,如果实数累计后的结果5 000 000 000,再累计你用整数还能表示吗?



活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
至圣

经验值: 23739
发帖数: 3384
精华帖: 52
回复:浮点数累积处理方法分享


只看楼主 楼主 20楼 2020-09-22 10:33:26
以下是引用zhangli0在2020-09-22 10:28:59的发言 >19楼

32位无符号整数表示的范围是0~4 294 967 295,32位实数表示的范围是±3.4e38,很明显实数比整数表示的范围大,如果实数累计后的结果5 000 000 000,再累计你用整数还能表示吗?


我不是提供了两种方案吗? 一种是40亿, 一种是组合实现任意位数


不忘初心
以下网友喜欢您的帖子:

  
版主

经验值: 43587
发帖数: 15780
精华帖: 61
回复:浮点数累积处理方法分享


只看楼主 21楼 2020-09-22 10:43:22

我主要要表达的意思是

1、hmi很累,你就能让它休息就休息吧。

2、plc中实现这种功能前面已经讨论很多,能用plc做的,就不要用hmi了。

3、plc的数据处理效率比hmi高多了,hmi要处理的事情太多了。

4、如果一定要用hmi处理,不是说不行,精度损失你还是无法避免的。

5、不停车的情况下,进行项目更改,存在很大的隐患。生产型企业如果造成损失是很大的,很少有在线改东西的。尽然能停线,那么算法写到plc中是最好的。


活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
收起
浮点数累积处理方法分享
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。