两个 double 做比较, 为什么加要个 1e-5 呢

2015-05-04 14:29:57 +08:00
 lyf362345
初学c++, 做练习题的时候跟答案对比, 发现有点不一样

练习题是:

描述
在北大校园里, 没有自行车, 上课办事会很不方便. 但实际上, 并非去办任何事情都是骑车快,
因为骑车总要找车、开锁、停车、锁车等, 这要耽误一些时间. 假设找到自行车,
开锁并骑上自行车的时间为27秒; 停车锁车的时间为23秒; 步行每秒行走1.2米,
骑车每秒行走3.0米. 请判断走不同的距离去办事, 是骑车快还是走路快.

输入
第一行为待处理的数据的数量n
其后每一行整数为一次办事要行走的距离,单位为米.

输出
对应每个整数,如果骑车快,输出一行"Bike";如果走路快,输出一行"Walk";如果一样快,输出一行"All".

样例输入
4
50
90
120
180

样例输出
Walk
Walk
Bike
Bike

我的代码
https://gist.github.com/fengqi/05b63a1264e52535b33b

答案里定义了个 `double delta = 1e-5` 然后比较的时候 再加上去, 这里有什么用呢
2004 次点击
所在节点    C
31 条回复
canautumn
2015-05-05 02:22:24 +08:00
这个答案可能不是很好。按理说判断大小不用考虑delta的,只有判断相等的时候才用delta。不过估计这个答案的原作者在m/3.0这儿写错写成了m/3,导致通不过oj,然后手动加了一个delta的hack才通过oj(我猜的,没测试)。还有一种可能是double精度太高,3.0实际存储的值是2.999999....,导致需要用delta来应对某个特殊的test case。想钻研的话可以看看这个 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (不负责任推荐,我也没看过,暂时没遇到需要考虑这些东西的情况)
laoyur
2015-05-05 09:11:59 +08:00
@Elethom 槽点比较独特,不过你是√的,:)
lyf362345
2015-05-05 10:56:59 +08:00
@canautumn 我更新了下代码, 按答案的写法, 貌似不是写错; 文档我找了分中文的
canautumn
2015-05-05 10:58:27 +08:00
@lyf362345 那就是第二个原因。我这边搜到的答案有说用float就可以通过oj,double就不行的。但没搜到使用delta的答案。
CRVV
2015-05-05 16:22:35 +08:00
相等的情况没写,和写了相等的情况,是两回事
先用阈值判断出来1.99999999和2相等,就不用比大小了
不判断相等,直接比1.99999999和2,结果是不相等
做题就按原题来做呗,何必自己精简题目
CRVV
2015-05-05 16:29:55 +08:00
原来在代码结尾加上了else输出"All"...
这题的每一个比较都是在大于、小于和等于3种情况里选择,所以每一步都需要阈值
不过我还是觉得这题适合用整数来计算
lyf362345
2015-05-05 18:43:47 +08:00
lyf362345
2015-05-05 18:48:28 +08:00
@CRVV All 部分是我后面加上的, 类似13楼的说法是 这个阀值是作者容忍的阀值还是计算机计算误差的阀值呢

觉得如果题目有个前提就好了, 关于阀值部分, 不然我可以完全不管误差, 因为在实际应用的时候是会人为的去掉这个误差的

我也不纠结了
CRVV
2015-05-05 19:21:51 +08:00
@lyf362345



我觉得你并没有搞懂浮点数的事,上面有人发链接了,先看明白再说吧
至少要知道下面这个情况的原因,Python 3.4.3
>>> 1.2-0.1
1.0999999999999999

这道题用1e-5得到正确的结果没有问题,代码应该也没错,至于1e-5这数选得好不好就另说了
lyf362345
2015-05-05 21:33:44 +08:00
@CRVV 好的
lyf362345
2015-05-05 21:33:55 +08:00
@CRVV 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX