打印

请教浮点运算的问题

[复制链接]
5242|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxm19820916|  楼主 | 2013-4-1 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们公司有款PLC产品使用STM32F103ZET6芯片,Keil 3编译器。做浮点数加法运算。
初始值为0.0,每个扫描周期自加10次,每次加1.0。最后加到1.677722E+007即停止了。
我们公司还有款PLC产品,使用三星2410芯片,ADS 1.2编译器,也是加到1.677722E+007即停止。
而同样的PLC程序,西门子PLC的结果是3.355443E+007.
如果每次自加0.1,则我们的2款PLC和西门子PLC计算结果一样,加到2097152.0停止。
感觉是每次自加1.0,作为浮点数来说,并不是1.0000000,有可能是1.000011这样的数字(打个比喻)。可能运算过程中丢失了精度导致计算结果和西门子PLC不一样。
请问:是浮点运算库的问题吗?哪里有下载?
沙发
王紫豪| | 2013-4-1 10:51 | 只看该作者
用 double 试试

使用特权

评论回复
板凳
zxm19820916|  楼主 | 2013-4-1 12:17 | 只看该作者
不行哦,我这里全是32位数据运算。单纯在运算时定义为double,得不到正确结果。

使用特权

评论回复
地板
王紫豪| | 2013-4-1 13:05 | 只看该作者
zxm19820916 发表于 2013-4-1 12:17
不行哦,我这里全是32位数据运算。单纯在运算时定义为double,得不到正确结果。 ...

你怎么知道不行

使用特权

评论回复
5
airwill| | 2013-4-1 13:50 | 只看该作者
最后加到1.677722E+007即停止, 这个范围内, 1.0 不会被损失精度的。
而同样的PLC程序,西门子PLC的结果是3.355443E+007.  怎么可能有这样的错误呢,怀疑是程序问题

使用特权

评论回复
6
zxm19820916|  楼主 | 2013-4-1 14:01 | 只看该作者
airwill 发表于 2013-4-1 13:50
最后加到1.677722E+007即停止, 这个范围内, 1.0 不会被损失精度的。
而同样的PLC程序,西门子PLC的结果是 ...

下载到所有的PLC的程序是一样的。西门子STEP7 Micro/WIN编写的。
网络1
LD   SM0.1
MOVR   0.0     VD0
MOVR   0.0     VD4

网络2
LD    SM0.0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0

网络3
LD    SM0.0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0
+R    1.0    VD0

使用特权

评论回复
7
zxm19820916|  楼主 | 2013-4-2 11:48 | 只看该作者
求助!

使用特权

评论回复
8
zxm19820916|  楼主 | 2013-4-15 11:25 | 只看该作者
继续求助。

使用特权

评论回复
9
zxm19820916|  楼主 | 2013-4-16 12:07 | 只看该作者
help me!

使用特权

评论回复
10
大秦正声| | 2013-4-17 09:54 | 只看该作者
三星的2410也可以做plc ?
消费级别的可以做恶劣的工业级?

使用特权

评论回复
11
大秦正声| | 2013-4-17 09:58 | 只看该作者
编译软件的问题?二进制符号位问题?
看结果相差一倍。

使用特权

评论回复
12
zxm19820916|  楼主 | 2013-4-24 09:52 | 只看该作者
大秦正声 发表于 2013-4-17 09:54
三星的2410也可以做plc ?
消费级别的可以做恶劣的工业级?

可以的。

使用特权

评论回复
13
zxm19820916|  楼主 | 2013-4-24 09:53 | 只看该作者
大秦正声 发表于 2013-4-17 09:58
编译软件的问题?二进制符号位问题?
看结果相差一倍。

是啊,看表现是相差一倍。

使用特权

评论回复
14
zxm19820916|  楼主 | 2013-5-30 18:24 | 只看该作者
airwill 发表于 2013-4-1 13:50
最后加到1.677722E+007即停止, 这个范围内, 1.0 不会被损失精度的。
而同样的PLC程序,西门子PLC的结果是 ...

是每次加1或2或4或8或16或32等等2的n(n=0,1,2。。。。。)次方的数据时,会有个终点值,到了这个终点值,西门子的处理是翻倍处理,使得终点值能计算到多一位的地步。而我们的算法里只是简单的相加,到了终点值没有额外处理。目前正在研究通用公式。

使用特权

评论回复
15
zxm19820916|  楼主 | 2013-5-30 18:25 | 只看该作者
大秦正声 发表于 2013-4-17 09:58
编译软件的问题?二进制符号位问题?
看结果相差一倍。

算法问题。是每次加1或2或4或8或16或32等等2的n(n=0,1,2。。。。。)次方的数据时,会有个终点值,到了这个终点值,西门子的处理是翻倍处理,使得终点值能计算到多一位的地步。而我们的算法里只是简单的相加,到了终点值没有额外处理。目前正在研究通用公式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

299

帖子

2

粉丝