首页 > 解决方案 > `tan` 函数是否返回不正确的结果?

问题描述

我正在我的应用程序中进行计算,并将我的问题缩小到tan函数。

Configuring GHCi with the following packages: 
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /private/var/folders/w2/m3v3grd53s191ys4wjc1tcnr0000gn/T/haskell-stack-ghci/2a3bbd58/ghci-script
Prelude> fov = 0.7853981633
Prelude> tan fov
0.9999999998051035
Prelude> :t fov
fov :: Fractional p => p
Prelude> fov = 0.7853981633 :: Double
Prelude> tan fov
0.9999999998051035
Prelude> :t fov
fov :: Double
Prelude> 

当我tan在手机(或我尝试过的任何其他计算器)上使用时,我得到的答案是:

0.0137086425

因此,看起来 Haskell 的tan错误是错误的,但这将是非常令人惊讶的。

我通常Double在我的应用程序中使用,但Double如上所示指定并不重要。

我还认为这是一个四舍五入的问题,并想尝试四舍五入到小数点后 4 位,但似乎除了 Haskell 中的 Integer 之外,你不能将 Double 舍入到任何东西?这对我来说也很奇怪。

有人可以解释一下吗?

标签: haskell

解决方案


简而言之:它使用弧度作为角度。您的手机可能设置为使用degree

弧度表示tan :: Floating a => a -> a角度。所以这意味着 0.7853981633 弧度大约是 45 度。

您的手机可能使用以度为单位的角度。我们可以通过乘以将度数转换为弧度pi / 180,所以如果我们计算0.7853981633 度数,我们得到:

Prelude> tan 0.7853981633  -- radians
0.9999999998051033
Prelude> tan (0.7853981633 * pi / 180)  -- degrees
1.3708642532692942e-2

度数的结果大约是3.269294210350715e-11关闭的,这可能是因为您只指定了十位小数。


推荐阅读