楼主: meishanjia1900
1524 5

[问答] 【求助】一个BUG,所谓0.15 <= 0.15为FALSE的问题,求高手解答 [推广有奖]

  • 0关注
  • 12粉丝

副教授

44%

还不是VIP/贵宾

-

威望
0
论坛币
3138 个
通用积分
45.8507
学术水平
193 点
热心指数
203 点
信用等级
161 点
经验
25351 点
帖子
703
精华
0
在线时间
988 小时
注册时间
2009-5-17
最后登录
2025-10-12

楼主
meishanjia1900 发表于 2012-5-20 13:20:30 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
以下是屏幕内容:
-----------------------------------------------------------------------------------------
R version 2.14.0 (2011-10-31)
Copyright (C) 2011 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: i386-pc-mingw32/i386 (32-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> a = 1
> a = a + 0.05
> a <= 1.05
[1] TRUE
> a = 0.1
> a = a + 0.05
> a <= 0.15
[1] FALSE
>

-----------------------------------------------------------------------------------------

我不懂这到底是为什么,请高手指教!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:bug Publications distribution Statistical information Copyright software welcome version licence

沙发
vinkwai 发表于 2012-5-20 16:21:57
不是bug,请看R FAQ的7.31
7.31 Why doesn't R think these numbers are equal?
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
meishanjia1900 + 1 + 1 + 1 非常感谢,很好的回复。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
meishanjia1900 发表于 2012-5-20 16:24:59
已经知道答案了,貌似R组人员早就了解该BUG,也不打算修补这一漏洞,他们只给出了一个补救措施:

--------------------------------------------------

Do not use == and != for tests, such as in if expressions, where you must get a single TRUE or FALSE. Unless you are absolutely sure that nothing unusual can happen, you should use the identical function instead

For numerical and complex values, remember == and != do not allow for the finite representation of fractions, nor for rounding error. Using all.equal with identical is almost always preferable.

--------------------------------------------------

所以,a <= 0.15 要改为:a < 0.15 | all.equal(a,0.15)

板凳
vinkwai 发表于 2012-5-20 18:15:50
这不能叫做bug吧

报纸
nkunku 发表于 2012-5-21 07:28:51
这不是bug

地板
meishanjia1900 发表于 2012-8-2 20:02:02
我现在对这一块非常头疼。

为什么?——不仅“==”失效,连纯粹的“>”与“<”也一并失效了。

你想,两个相等的数a,b,就因为系统的原因,造成“a == b”出现 FALSE 的结果。

这还不算完!结果你发现“a > b” 或 “a < b” 的结果变成 TRUE 了!

故 >, < 的判断也会失效!这表示计算机的判断反而是灵敏的,一点点纯计算上的微小差别都会引发误判!

所以,编程时:

a > b  变成 a - b > 0.00001 即 a > b & abs(a - b) > 0.00001
a < b  变成 b - a > 0.00001 即 a < b & abs(a - b) > 0.00001
a == b  变成 abs(a - b) < 0.00001
a >= b  变成 a - b > -0.00001 (注意负号)
a <= b  变成 a - b < 0.00001

语句的目的是使灵敏的计算机迟钝化!0.00001 比计算机内部的标准要“迟钝”很多(即大很多)!

这样反而在一些情况下不容易闹笑话,“0.15 <= 0.15 为FALSE”的笑话就不会出现了。

但是,这样写非常费劲!很吃力!

一个简短的判断,最后竟然搞成这么别扭的式子,我认为这也可以叫BUG了。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 15:11