作者anfranion (安弗尼恩)
看板b97902HW
标题Re: [心得] 为了玄妙的0.000000001 快哭出来了
时间Thu Oct 2 00:38:29 2008
大家好,我是路人甲阿南(咦)
在我惨烈地传了N次之後总算是过了,感谢森林真强者(奇怪我又叫不一样的称呼了XD)
提供几个浮点数误差的修正点,供大家参考罗
1. 第一个位置(也就是输入进来的),这个不用修正。
(理应不用修正吧,他又没有做任何的事囧)
2. 跑回圈的次数
计算跑回圈的次数有很多种方式,可以用加减乘除,反正想的到得都可以(咦)
我是用减的,於是我的code出现了
while(T >= dt)
{
[...]
T -= dt;
}
这样的写法必须要修正成 T + 1e-10 >= dt才会过
请注意如果修正太小例如 1e-15的话,第六组测资会爆
然後据我刚刚的实验结果,不加等於也是会过的,不过我觉得加上去比较好
比较符合真正的意涵
如果是除法的修正,我想这篇原PO已经给的很清楚了
强制转换型别的(int)记得要跟後面要转的东西连好,不然他不会理你
for(j=1; j<=(int)(T / dt + 1e-10); j++)
小小的建议是可以把中间部分先在外面写好,毕竟除法也是挺花时间的~
T /= dt;
T += 1e-10;
偷懒写成 T /= dt, T += 1e-10;也是可以的
这应该是coding style的问题,强者们有要PO教学文吗XD
(还是已经PO过了囧?)
3. 输出的部份
这篇的原PO也提过了,因为有可能有-0.000的情况
所以在printf()那里要修正1e-10。
(这个部份可以修正1e-15没有问题)
4. 比较的部份
呃,这题在比较大小时没有误差造成的问题,所以可以不用修正XD
有时候如果有等於之类的就要注意一下了~(像刚刚2.我的写法就是)
大致的误差点应该就只有这样,如果这几个地方都对了但是还没有过,
那可能要检查一下其他的地方,然後找真强者们帮忙啦XD
好了,路人甲的废言就到此结束了
请大家看在我这麽认真PO文的份上,明天要记得来帮女篮加油唷囧/
我去睡了,各位晚安XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.50.107
1F:推 benck:我也是找森林真强者问问题的呢 !! 10/02 00:46
2F:→ sa072686:噢大家都找森林真强者耶,有PO文有差XD 10/02 01:09
3F:推 iForests:Q_____Q 谢谢大家 10/02 01:15
4F:推 sa072686:结果找我的都是杀钢弹XDDD 10/02 01:40