免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4460 | 回复: 19
打印 上一主题 下一主题

[C] wps for linux最近的重大bug [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-22 14:03 |只看该作者 |倒序浏览
这是wps开发人员对这个bug的一个简单描述:

"不是,我们反复确认过了。一段类似下面的代码出问题了。
double valx100 = val * 100;
unsigned int valx100h = *((unsigned int *)&valx100+1);

val=1.23456的时候valx100h变成了0。"

都来看看这个bug,发表点见解。
wps开发人员已经将该bug定义为gcc编译器的bug。希望他们能提供更加详细的bug描述。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-02-22 14:15 |只看该作者
取double的后面那4字节?不知道有什么意义。
依赖于浮点数存储格式

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
3 [报告]
发表于 2013-02-22 14:18 |只看该作者
戴上护目镜,以免被华丽的指针/强制类型转换操作给亮瞎了……

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2013-02-22 14:18 |只看该作者
本帖最后由 bruceteen 于 2013-02-22 14:18 编辑

sizeof( unsigned int ) 是多少?
不要说“double valx100 = val * 100; val=1.23456的时候 ……”
直接说 printf( "%016llX\n", *(long long*)&valx100 ); 输出是多少

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2013-02-22 14:34 |只看该作者
如果不是gcc的bug的话
a. 最大可能是 unsigned int 是 64bits
b. “val=1.23456的时候”并不是严格的1.23456,而是 1.2345599365234375,此后 valx100 的16进制值为 405EDD2F00000000,恰巧尾部是4字节的0

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
6 [报告]
发表于 2013-02-22 14:42 |只看该作者
64位机器上,这个操作无意义。

32位机器上:
小端序的机器上,这个操作似乎是取指数的,但没有丢掉符号位,又稍带了尾数的开头部分;大端序的机器上,这个操作是取尾数的后半部分。

相比之下,应该只有小端机器上的操作有意义。目的可能是为了实现快速的double到float转化。

论坛徽章:
0
7 [报告]
发表于 2013-02-22 14:51 |只看该作者
回复 5# bruceteen


    int在什么机器上有64位?

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
8 [报告]
发表于 2013-02-22 14:52 |只看该作者
本帖最后由 shan_ghost 于 2013-02-22 15:08 编辑
bruceteen 发表于 2013-02-22 14:34
b. “val=1.23456的时候”并不是严格的1.23456,而是 1.2345599365234375,此后 valx100 的16进制值为 405EDD2F00000000,恰巧尾部是4字节的0


应该就是这个问题了。

金山可能是想做从double到float数据类型的快速转化。

因为float的表示是seeeeeeeemmmmmm...
而double的表示是seeeeeeeeeeemmmmmm...

这样,截取double的前4个字节(在小端序机器上,其实是物理内存里的后4个字节,这就是上面一堆操作的意义所在),然后保留符号位,把剩余部分左移3位,得到的就是对应的float表示。
这比正规的double-->float转换要快很多,只是尾数部分会稍微损失一点点精度(3个位)。

但对你这个特殊数据,转换后就变成1.0了。

这不是bug……或者说,这是数据类型选择的bug,不是gcc的。

论坛徽章:
0
9 [报告]
发表于 2013-02-22 15:00 |只看该作者
我曾经遇到过这样的问题:

gcc下float 1.0 其实是0.999999,而vc下是1.00000,对浮点数来说两者是一样的,但是如果截取为int,则一个是0,一个是1,就有区别了。

金山的代码可能在windows下可以使用,而用gcc编译后出现了问题,所以他们断定这是gcc编译器的问题?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
10 [报告]
发表于 2013-02-22 15:00 |只看该作者
leslielg 发表于 2013-02-22 14:51
回复 5# bruceteen
int在什么机器上有64位?

在 ILP64 数据模型下 int 就是64bits,你可以Google一下 ILP64
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP