1
dslwind 2015-05-04 14:43:29 +08:00 via Android 1
大概是因为浮点数在计算机内部的存储和表示的问题,并不是所有浮点数都能“精确”的等于你想要的值。ps. biketime应该等于m/3.0+27+23。/3是整除……
|
2
acros 2015-05-04 14:45:38 +08:00 1
同楼上。
delta这个名字就表明了意思:误差范围。 |
3
zhicheng 2015-05-04 14:48:29 +08:00 1
|
4
cover 2015-05-04 14:50:45 +08:00 1
double的误差范围把。。比如你在做几何学运算的时候,两个角度相差 0.0001度的时候你就认为两个角度相等的意思
|
9
msg7086 2015-05-04 15:11:47 +08:00
10进制的有限小数在2进制里不一定就是有限小数。
比如1.1(循环小数)+1.2(循环小数) 与 1.3(循环小数) 就不一定会相等,而是在最尾端可能会出现一个很小的误差。 |
11
chai2010 2015-05-04 15:57:01 +08:00
|
12
Elethom 2015-05-04 16:14:54 +08:00 via iPhone
沒人吐槽應該是「both」麼?
|
13
comicfans44 2015-05-04 16:17:55 +08:00
浮点误差只有在比较相等的时候会用到,比如你判断
if(abs(walkTime-bikeTime)<delta){ cout<<"bike walk time equal" } 可是现在你的逻辑是比较大小,当然是直接比较值,不明白答案为什么有delta。 如果说进制不同导致的计算误差用一个delta来补足,显然也是不合适的。 1e-5就不能用double准确表示(这本身就是一个十进制小数),怎么能假定加上一个不准确的delta就能让结果绝对准确?怎么能确定计算结果正好少了delta?如果需要绝对的准确性,那不应该加上delta,而是使用有理数进行计算。个人觉得这个delta是不合理的。 |
14
WKPlus 2015-05-04 16:23:55 +08:00
@comicfans44 对呀,不是浮点数用来判断是否相等的时候才需要引入一个delta的么?
|
15
Neveroldmilk 2015-05-04 17:08:17 +08:00
浮点数在计算机里不是精确存储的,会有误差,所以要设定阈值。
|
16
koykoi 2015-05-04 17:17:59 +08:00
比较大小要加什么阈值...
即使是 tolerance 设为 1e-5 也没什么道理 |
17
chai2010 2015-05-04 17:35:33 +08:00
fix typo: IEEE854 -> IEEE754
|
19
lyf362345 OP |
20
CRVV 2015-05-04 23:38:41 +08:00
题目里说:如果一样快,输出一行"All"
我咋没在代码里看到"All"... 判断相等需要用阈值 而且这题直接和100比较,大于100骑车,小于100走路,关浮点数什么事 |
21
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 (不负责任推荐,我也没看过,暂时没遇到需要考虑这些东西的情况)
|
24
canautumn 2015-05-05 10:58:27 +08:00
@lyf362345 那就是第二个原因。我这边搜到的答案有说用float就可以通过oj,double就不行的。但没搜到使用delta的答案。
|
25
CRVV 2015-05-05 16:22:35 +08:00
相等的情况没写,和写了相等的情况,是两回事
先用阈值判断出来1.99999999和2相等,就不用比大小了 不判断相等,直接比1.99999999和2,结果是不相等 做题就按原题来做呗,何必自己精简题目 |
26
CRVV 2015-05-05 16:29:55 +08:00
原来在代码结尾加上了else输出"All"...
这题的每一个比较都是在大于、小于和等于3种情况里选择,所以每一步都需要阈值 不过我还是觉得这题适合用整数来计算 |
28
lyf362345 OP @CRVV All 部分是我后面加上的, 类似13楼的说法是 这个阀值是作者容忍的阀值还是计算机计算误差的阀值呢
觉得如果题目有个前提就好了, 关于阀值部分, 不然我可以完全不管误差, 因为在实际应用的时候是会人为的去掉这个误差的 我也不纠结了 |