作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] 关於反三角函数的计算
时间Fri Jul 26 15:24:33 2013
※ 引述《newsted5566 (NEWSTED5566(乱劣我文))》之铭言:
1F:→ ken1325:我执行你的程式码,是回传30。 07/26 12:40
2F:→ newsted5566:我的电脑是mac 07/26 13:33
3F:→ howardxu:// 改成 / 就对了 为什麽要用//? 07/26 14:31
看起来像是平台差异, 浮点数误差和 floor division 合力造成的有趣现象
以下「前者」指 Windows (Python 2.7.5, MSC 64 bit)
「後者」则是 Mac OS X (Python 2.7.2, Apple Clang 4.0)
前者 math.asin(0.5) * 180 显示 94.247779607693
80
後者 94.247779607693
79
这个差距似乎是两个平台实作 arcsin 得到的结果不太一样
不过哪个比较正确我就不知道了, 我不想手算验证...
接下来 // d 就有趣了
// 在 Python 里叫做 floor division (参见 PEP238)
这个除法会把出来的结果自动做 floor
原始用意是用来模仿类似 C 里面 int a = 3 / 5; (会得到 1) 的行为
因为 math.pi 在两个平台上都是 3.141592653589793
(感谢老天再後面一位是 2, 所以没有进位问题)
数学上
94.24777960769380 / 3.141592653589793 约为 30.0000000000000031
94.24777960769379 / 3.141592653589793 则是 30 整
可是由於浮点数误差, 真正出来的数字会比上面的小一点点
(我猜的, 这数字太大我实在是不想换算成 IEEE 754 来证明)
而前者仍然在 30 以上, 所以 // 会得到 30.0
後者则是变成很接近但小於 30, 出来就变成 29.0
应该是这样吧
改用 / 的话因为 Python 会自动调整输出
「比 30 大一点点」和「比 30 小一点点」的浮点数都会被显示成 30.0
所以看起来两者就会相同
顺带一题, 如果你真的需要准确的数学, 请考虑改用比较专门的 module
--
「我最想要的同伴嘛,首先是要笑口常开,其次是我们能永远不会发生误会。
如果这些都能办到的话,嗯,如果他是世界上第一流的桥手,也还不错。」
-- 班尼多‧加罗素,前义大利蓝队成员
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.81.146
4F:推 lc85301:LOL 07/26 16:26
5F:推 ya790206:C 语言的3/5 结果应该是0。至少在GCC下是这样。 07/26 16:55
6F:推 ck574b027:楼上XD 07/26 17:17
7F:→ uranusjr:请自行带换成 5 / 3... 07/26 18:40