我正在应用程序中进行计算,并且我已经将问题缩小到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以外的任何值?对我来说,这似乎也很奇怪。
有人可以解释吗?
答案 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
,这可能是因为您仅指定了十个小数位。