打印

99.99%可能性,KEIL BUG

[复制链接]
楼主: ayb_ice
手机看帖
扫描二维码
随时随地手机跟帖
81
Keil 论坛上也有类似的讨论:

http://www.keil.com/forum/19617/
以及这一个:
http://www.keil.com/forum/14461/



highgear 发表于 2011-9-29 21:07


的确编译器拥有选择向零舍入或离零舍入的自由,但至少自己应该统一方向。
一会儿这样、一会儿那样,你能认为这种设计不存在问题吗?你能说这不是一个bug吗?除非Keil公开声明:“大家别用有符号整型做除法,俺不保证后果……”

使用特权

评论回复
82
t.jm| | 2011-9-30 08:09 | 只看该作者
本帖最后由 t.jm 于 2011-9-30 08:14 编辑

79# highgear 那两个帖子也能算讨论?就几个人说了几句话,正反1:1,说的都不到这里的1%,另一个明显是我们这里的ejack去报告的!
已经说过是不是BUG不是那么判地,精度问题可以接受,逻辑错误问题是不能接受的!
假如:
signed char ad1,ad2, x,y;
ad1 = -5;
ad2 = -5;
x = ad1/4;
y = ad2/3;
if(x > y){
....
}
else{
....
}

使用特权

评论回复
83
highgear| | 2011-9-30 08:56 | 只看该作者
作为技术人员应具备严谨的精神和理性的态度。对于负整数除法,我比较了 c89 与 c99 标准,c89 并未规定舍入方向,而 c99 规定了 truncate to zero. 如果 keil c 声称遵循 c99, 则向上舍入是一个bug, 否则,就不能说这是一个bug, 不论是否合乎人们的预期,也不宜凭个人感觉或是好恶。虽然可以指责keil违背一致性原则,而违背一致性原则有时比 bug 还恶劣。

Keil C 遵从 C90:
Keil C compilers are based on C90. We added some language extensions as practical concessions to the architectural peculiarities of the microcontrollers we support and the needs of embedded systems programmers.


t.jm 楼上的例子在 c89 之类的编译器下没有实际意义,因为编译器不保证负整数除法的舍入方向,这应是程序员自己来保证舍入。t.jm **是一个bug, 那么请指出违背了标准中的哪一条原则。

使用特权

评论回复
84
ayb_ice|  楼主 | 2011-9-30 09:11 | 只看该作者
可以认为,不一致就是BUG
我还认为是严重BUG

使用特权

评论回复
85
t.jm| | 2011-9-30 09:12 | 只看该作者
本帖最后由 t.jm 于 2011-9-30 09:15 编辑
作为技术人员应具备严谨的精神和理性的态度。对于负整数除法,我比较了 c89 与 c99 标准,c89 并未规定舍入方向,而 c99 规定了 truncate to zero. 如果 keil c 声称遵循 c99, 则向上舍入是一个bug, 否则,就不能说 ...
highgear 发表于 2011-9-30 08:56

你还真能据“理”力辩呢!!
“虽然可以指责keil违背一致性原则,而违背一致性原则有时比 bug 还恶劣。”
你意思是说就像一个IC,你的使用超出我的承认书范围,出现任何问题我一概不负责???

这我不苟同!!!!
其它编译器又是以什么为标准?IAR8051,FSL CWS08,STVD,KEIL ARM,SDCC 51...怎么不见别人犯错?

使用特权

评论回复
86
highgear| | 2011-9-30 10:12 | 只看该作者
ayb_ice: 那么就拿出确实的证据出来,而不是“我认为”。 不一致性在 c#, java 语言中也都存在,例如java 中著名的字符串 == 比较问题,也不被认为是 "bug"。
t.jm: 首先, -5/4 = -2 不是错误。其次,如果ic的承认书范围没有违背法令或是行业标准,那么用户是应该为不当使用而负责。至于其他编译器,并不是标准,无从参照。

使用特权

评论回复
87
ayb_ice|  楼主 | 2011-9-30 10:16 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-30 10:18 编辑
ayb_ice: 那么就拿出确实的证据出来,而不是“我认为”。 不一致性在 c#, java 语言中也都存在,例如java 中著名的字符串 == 比较问题,也不被认为是 "bug"。
t.jm: 首先, -5/4 = -2 不是错误。其次,如果ic的承认 ...
highgear 发表于 2011-9-30 10:12

证据就是
从数学上讲,不同的写法意义完全一样,没有任何歧义,那么结果就应该一致
我不相信任何MCU,CPU有这样的硬件,计算-5/4一会儿结果-2,一会儿结果-1
套用经典的话"长得丑不是你的错,出来吓人就是你的不对了"

使用特权

评论回复
88
t.jm| | 2011-9-30 10:58 | 只看该作者
ayb_ice: 那么就拿出确实的证据出来,而不是“我认为”。 不一致性在 c#, java 语言中也都存在,例如java 中著名的字符串 == 比较问题,也不被认为是 "bug"。
t.jm: 首先, -5/4 = -2 不是错误。其次,如果ic的承认 ...
highgear 发表于 2011-9-30 10:12

我说过单纯的-5/4 = -2 不是错误,这至多是精度问题,也就是把-1.25当成-2至多是精度问题,没什么大不了的。如果它的除法库也采用了同样的策略-5/3=-1.6667也当成-2(实际上这也做得到!),这就绝对不是BUG了!
然而它不是,我从没把单纯的-5/4 =-1也好,=-2也好认为是个BUG,|-5/4|>|-5/3|才是BUG!

使用特权

评论回复
89
刘前辈| | 2011-9-30 12:52 | 只看该作者
本帖最后由 刘前辈 于 2011-9-30 13:01 编辑

highgear 真逗,-5/4 = -2 在这里绝对BUG!这里根本不是精度问题;谁都看到了,这是keil_C51算法错误! —— 2位带符号数相除能用逻辑移位计算?既可以等于a,也可以等于a-1。余数忽略?!

       什么编译器教你这么干的?还说是玩了一辈子软件编程的人。别人怎么知道调用CDIV精确计算?商在A,余数在B。结果唯一。就你知道用移位粗略计算,简单快捷呀……

        还真不知道你那潜艇是怎么潜入深海5千米的;说不定是粗略计算值,实际只有4.1千米,然后仪表显示粗略精度5.0千米,于是打破世界纪录……

(注释一下:潜水器深海5千米世界纪录是故事比喻,本人非专业,不确定。免得有人故作**。)



//

使用特权

评论回复
90
刘前辈| | 2011-9-30 13:30 | 只看该作者
本帖最后由 刘前辈 于 2011-9-30 17:02 编辑

提醒highgear所长一句:先把别人做过的实验重做一遍,否则连别人说的是什么都不知道,还一个劲的在这引经据典C99,舍入方向……南辕北辙,根本与讨论不搭界。

特别理解82# t.jm ,“highgear说的连这讨论的问题1% 都不沾边。”别人说的是: keil 在计算z/3, z/5 时,都能正确调用CDIV库函数得到正确值,唯独 z/4, 使用了移位算法,结果得出错误值-2,余数更没有了。——同一编译器算法不一致,按照highgear理论,一会向上舍入,一会向下舍入,忽左忽右,让程序员怎么办?!
         所以说绝对BUG。 仔细看清楚LZ和t.jm 他们讨论的是什么,再来推销你的精度修正吧:

别人已经十分精确了:-5 / 3 = -1  余数   -2      根本没有舍入问题。在这胡扯。



z / 4 = -2   余数  0  ?



哈,别人都做过多少遍实验的。highgear 做过一遍实验么?你的计算机里连keil-C51都没安装过,在这空谈标准?


//

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
bhsdlmj + 1
91
fabergas| | 2011-9-30 16:28 | 只看该作者
20# linbei1988

告诉他那里可以下载和谐用的注册机,叫KEIL官方测一下!

使用特权

评论回复
92
t.jm| | 2011-9-30 16:36 | 只看该作者
20# linbei1988  

告诉他那里可以下载和谐用的注册机,叫KEIL官方测一下!
fabergas 发表于 2011-9-30 16:28

这不是问题,告诉keil,我的程序就几个字节!!

使用特权

评论回复
93
highgear| | 2011-9-30 20:56 | 只看该作者
你刘公公就拉倒吧,不是我骂你,你刘公公狗p不懂,就不要丢人现眼了,去把那些PK完成。你刘公公若不服气,我向你刘公公提出一个很简单的PK: 完全用整数运算完成sin, atan 函数,要求精度可达 0.001,你刘公公有没有胆量?

t.jm, ayb_ice: 这个问题其实我们大家都很清楚,我所**的只是定罪必须以法律为准绳。既然有人已经把这个问题提交给了Keil, 那么我们就拭目以待,看看keil的最终说明。同时,这样的辩论收获很大,重新看了一遍c89/c99, 让我对标准有了新的认识,这得谢谢大家。

使用特权

评论回复
94
刘前辈| | 2011-10-1 10:37 | 只看该作者
本帖最后由 刘前辈 于 2011-10-1 11:35 编辑



93#

                 ……我所**的只是定罪必须以法律为准绳。……



         highgear  不愧是50 后,“要以事实为依据,以中国***思想为基础制定的法律为准绳……”  
         ……病的不轻啊。

还这成天找俺PK ?先把你的哲学家就餐用管程机制完成试试,就够你玩到退休了。    退休后写一篇《哲学家就餐经典问题的管程解法》,也算是能载入史册的讲习所长了。
          sin 函数 ? 满大街随便拉一个人都知道,精度0.00001 ? 教教你,国家标准早就有现成的表,你会输入机器,会造会查就行啦。什么?嫌国家标准精度不够高?那你自己计算,自己造个精度比国标更高的表 : z / 4= -2 还是-8 ,精度随你自己造,保证没人给你定罪。


         老刘从没有胆量做别人做过的事。——随波逐流这一点咱敬佩你所长,—— 一个16岁上大学的神童如今满大街都是了。……

知天命的人还玩什么sin,atan ?书上多得是例程,你花一辈子时间也不可能比标准写的还好;     还是做些给世人留下点自己一生不同于他人的印记为好。否则,昔日神童,快退休了也没看出 神在哪里,除了会骂几句“狗P ……”

   
       刘公公现在研究的是分布式OS,至于sin 函数, 还是老神童留给自己慢慢玩吧……


、、

使用特权

评论回复
95
highgear| | 2011-10-1 22:05 | 只看该作者
刘公公啊,瞧你那德性,勇于私斗,怯于公战,不敢就别找借口。我还没有拿那些更难的运算来难为你刘公公,这个 PK 是用全整数运算,不是浮点,你刘公公在书中找不到例子。比起全整数的 fft 及其应用,数学算法,矩阵运算来说,sin, atan 已经是最基本,最简单的了。

既然刘公公研究的是分布式OS,那么我提出以前的那个 PK:用bios中断来实现一个简单的,非抢占的任务调度器,有无优先级都可以,这个你刘公公应该敢了吧?
别说废话,别找借口,拿出点男人样出来给大家看看!

ayb_ice: 对不住了,在你的楼里PK. 我知道刘公公不敢应战,所以就不另开主贴。

使用特权

评论回复
96
ayb_ice|  楼主 | 2011-10-2 14:43 | 只看该作者
通过PK学到知识才是王道

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
97
highgear| | 2011-10-5 08:21 | 只看该作者
顶 ayb_ice.

PK 是学习的动力之一,如果没有PK, 我想我绝对不会去温习 bios 以及 80x86 的结构,也不会认认真真,沉心静气地做一个自己的任务调度器。就像没有这个讨论,我不会去看c89/c99标准,不会去查资料。

刘公公在论坛是喷口水是胆气十足,豪情万丈,一旦玩真的就失踪了。

使用特权

评论回复
98
Cortex-M0| | 2011-10-5 11:02 | 只看该作者
呵呵!

PK确实是学习的动力之一,如果没有PK,  我想我也绝对不会去编写C51中最具有山寨特色的浮点数快速除法运算,要知道,可能这一算法我这辈子都用不上!

谢谢刘前辈的激将法,当用中颖SH79/88/89系列的准16位乘除指令(16*8位乘法,16/8位除法),经过简单的组合运算,成功替代原Keil C51的加减法模拟除法程序,大幅度地提升了原浮点数除法的运算速度时,我还是很兴奋的,验证了用乘除法组合的快速除法算法的可行性和正确性。

有兴趣的盆友可去看一看~~~
最据山寨特色的《中颖快速浮点乘、除法程库》!!!
https://bbs.21ic.com/icview-273369-1-1.html

使用特权

评论回复
99
刘前辈| | 2011-10-6 12:39 | 只看该作者
本帖最后由 刘前辈 于 2011-10-6 13:03 编辑
97#
PK 是学习的动力之一,如果没有PK, 我想我绝对不会去温习 bios 以及 80x86 的结构,也不会认认真真,沉心静气地做一个自己的任务调度器。就像没有这个讨论,我不会去看c89/c99标准,不会去查资料。


highgear 真是遗老族,又回到20多年前玩起了BIOS ?

前一阵花足了时间和生命自己做sin ,好不容易有点成果,拿出来到处找人PK:“谁比我厉害……”经老刘提醒,才知道别人早就做过了,而且已成了国家标准。——唉,又白干了,人又老了一截。“积累了经验……”自我安慰……

如今又要拿出BIOS基础上的调度器找人PK ?这都什么朝代的技术了?让老刘陪你玩?——再说你老所长做了一辈子、自己还没完成的、猴年完成、有生之年是否能完成?自己都还不知道的事情,就拿出来和年轻人PK ?谁陪你玩?忽悠菜鸟呢。

让老刘再教教你:
1、老刘说的分布式OS不是你说的什么板载 bios 上完成的调度器,还是先把“分布式控制”和“集中式控制”的概念搞清楚再说吧。

2、分布式OS至少是3个机器构成的系统,(2个机器只能算点对点通信技术。)因此至少要用到网卡驱动。——自己写一个网卡驱动?你所长行吗?别光说,做一个给大家看看。   ——  highgear 所长研究那么多年,终于会通过bios 调用驱动板载网卡,你看你多厉害哟。我劝你到联想计算机生产集团主板生产厂去工作更合适。

3、highgear 又在重复别人早就做过了的事情:如今,“千年老二”都做不成了,能不能做的成“小三”,还是个问题。建议看看下列早就出版过的书籍:(别总吹嘘“咱不看书,照样天下第一。”如今时代不一样啦。还以为天下都是21IC论坛上的初学者?你是他们的入门老师。)

《自己动手写操作系统》  于渊编著  尤晋元审校  电子工业出版社版

《一步步写嵌入式操作系统》 李无言著    电子工业版

《自己动手写嵌入式操作系统》   蓝枫叶编著   电子工业版

哈,老刘早就说过,俺从不做别人做过的事情。(你看所长多厉害,“我不用C,我在底层完成一个调度器……”然后拿来到处找人PK……这人犯得什么毛病?)

        老刘要写的是关于如何做 “嵌入型分布式OS”。——没人写过吧,得意吧。就算现在告诉你所长创新题目,“千年老大”方向了,你也做不出来耶。—— 一个令牌环网就够你研究一辈子。PK BIOS?20年前的技术,即使做出来有什么意思?! 写本书出来我想帮你出版都担心没人看。
      
        PK 点前端的,技术含量高的、别人没做过的好不好?(恐怕提不出来哟)
     
       也不指望什么别的了, 就问 highgear 老所长一个简单的常识:分布式OS中的令牌环访问机制是谁提出来的?——看看留名史册的是什么样的人和技术。
         所以,您老人家现在不知道的事情还多呢,倚老卖老?卖给自己回家养老把玩还行……卖给别人,恐怕没人要。
        我的关于BIOS 详解之类的书,早就扔到地下室了。现如今买都买不到,古董级啦,谁要?免费赠送。至少有4、5本,9.9成新。


、、

使用特权

评论回复
100
刘前辈| | 2011-10-6 15:22 | 只看该作者
所长是不是还要找俺PK 玩“注册表”?别别别……千万别,比我玩的好的人多得是,需要的话我请他们帮我做就行了,我没必要省钱自己做,我也没那么长寿。咱一生做好一件事,别人没做过的事,足矣。
     其它的,您慢慢自己玩,——网卡驱动,正版-- 20K 银子;盗版-200¥。您不愿给别人20K 银子,情愿自己研究?省钱?  

我想您玩好BIOS……调度器,就够养老了……


、、

使用特权

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

本版积分规则