tan函数是否返回错误结果?

时间:2020-09-06 01:13:14

标签: haskell

我正在应用程序中进行计算,并且我已经将问题缩小到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位,但是看来您不能将Double舍入到除Haskell中的Integer以外的任何值?对我来说,这似乎也很奇怪。

有人可以解释吗?

1 个答案:

答案 0 :(得分:5)

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

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,这可能是因为您仅指定了十个小数位。