Project1

标题: RGSS3又一個坑娘的BUG [打印本页]

作者: 流川枫    时间: 2014-4-3 09:49
标题: RGSS3又一個坑娘的BUG
i=1.0
i-=0.1
i-=0.1
i-=0.1
i-=0.1
i-=0.1
i-=0.1
i-=0.1
i-=0.1
i-=0.1
p i

以上的腳本在RMVX得出0.1,而RMACE上卻得出0.10000000000000014這樣的腦殘數值。。

而一個遊戲裏 判斷 當 i>0.1時才遞減,但是由於RMACE的腦殘數值,結果運算結果不正常!
作者: 怪蜀黍    时间: 2014-4-3 10:14
每自减一次就msgbox一次,看看哪一步出错
作者: orochi2k    时间: 2014-4-3 11:48

VX到VA完成了一次计算机科学回到解放前的革命么~\(≧▽≦)/~
作者: 怪蜀黍    时间: 2014-4-3 20:11
i = 1.0
i -= 0.1
i = (i * 10).round / 10.0
每次自减都做这三步吧
作者: Sion    时间: 2014-4-3 20:36
自己 round 呗。浮点数也是取近似值,精度一般用不到那么高,直接用整型得了。
作者: LBQ    时间: 2014-4-3 22:45
论为什么不应该进行大量浮点数运算
作者: 无脑之人    时间: 2014-4-4 12:39
RGE问题比这还严重……
设计的时候避免就好了啦,以前精度各种丢的时候不还是一样该做做←←
作者: fux2    时间: 2014-4-4 12:50
运算的时候尽量别用浮点,取结果的时候再取,比如你这里可以改成
  1. i=10
  2. p i.to_f/10
  3. i-=1
  4. p i.to_f/10
  5. i-=1
  6. p i.to_f/10
  7. i-=1
  8. p i.to_f/10
  9. i-=1
  10. p i.to_f/10
  11. i-=1
  12. p i.to_f/10
  13. i-=1
  14. p i.to_f/10
  15. i-=1
  16. p i.to_f/10
  17. i-=1
  18. p i.to_f/10
  19. i-=1
  20. p i.to_f/10
复制代码

作者: chd114    时间: 2014-4-4 21:22
笨方法= =把小数扩大10*N倍···计算完再缩回去···
作者: 晴兰    时间: 2014-4-6 12:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: taroxd    时间: 2014-4-6 18:15
本帖最后由 taroxd 于 2014-4-6 18:19 编辑

这哪里是bug,不信楼主 0.4+0.2 试试看。看看c++会不会悲剧,ruby会不会悲剧
要浮点数精确点楼主可以试试二进制=。= 不然就给我老老实实用整数

给楼主两篇不错的文章(都是常识!)
http://justjavac.iteye.com/blog/1725977
http://justjavac.iteye.com/blog/1724438
作者: Shy07    时间: 2014-4-6 22:29
本帖最后由 Shy07 于 2014-4-6 22:33 编辑

写程序最可怕的就是想当然,千年虫是一例,现在楼主也是同样的错误。



——摘自《松本行弘的程序世界》

Matz 这本书挺不错的,新手和老鸟都可以一读。最近我在读《代码的未来》,感觉也不错。楼主发现问题是值得肯定的,但是没经过验证导致被打脸,可惜。
作者: 流川枫    时间: 2014-4-16 16:06
晴兰 你真是有点自己打自己的嘴巴,自己试试用WIN7或XP自带的计算器做1除以3然后再乘以3的算术吧

你的编程技术真的不行

asd.gif (39.03 KB, 下载次数: 20)

asd.gif

作者: 流川枫    时间: 2014-4-16 18:21
本帖最后由 流川枫 于 2014-4-16 18:29 编辑

晴兰:“就像十进制的一个0.333333333....你的计算器表示长度有限,于是变成了0.33333333,加三次便不是1了而是0.99999999。”
掌嘴,自己看图我在C++中计算得出1这就是真实。

QQ截图20140416181915.png (6.79 KB, 下载次数: 22)

QQ截图20140416181915.png

QQ截图20140416182921.png (10.8 KB, 下载次数: 19)

QQ截图20140416182921.png

作者: 流川枫    时间: 2014-4-16 19:05
如图在C++中只要将double四舍五入到15位后,就会得到精确的0.1

QQ截图20140416185631.png (8.81 KB, 下载次数: 17)

QQ截图20140416185631.png

作者: 流川枫    时间: 2014-4-16 19:24
a = 1.0
for i in 1..63
  a -= 0.1
end
p a

以上的代码在RGSS1和RGSS2上都得到5.3,只有RGSS3不正确。因为RGSS1和2在每次计算浮点数运算后都将浮点数四舍五入到15位小数,所以可以保证加减的精度。但是RGSS3却不再四舍五入到15位于是就出现了脑残数值。

QQ截图20140416192209.png (26.23 KB, 下载次数: 17)

QQ截图20140416192209.png

作者: satgo1546    时间: 2014-4-17 18:28
连帖= =
因为Windows的计算器就是这样,给你舍入了。
作者: 晴兰    时间: 2014-4-17 21:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 晴兰    时间: 2014-4-19 20:39
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1