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

Cra*_*tow 0 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> 
Run Code Online (Sandbox Code Playgroud)

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

0.0137086425
Run Code Online (Sandbox Code Playgroud)

所以,看起来 Haskelltan是错误的,但这会非常令人惊讶。

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

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

有人可以解释一下吗?

Wil*_*sem 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • @CraigTreptow几乎在所有编程语言中,在数学中弧度是默认值。与其将圆角测量为 360 度(这是一个相当随机的任意数字),不如使用 2pi(圆周长(与直径的比率))更有意义。此外,几个三角方程仅适用于弧度:例如,sin 的导数是 cos,但仅适用于弧度。对于度数,突然会突然出现一个 pi/180 因子,这很不方便。 (8认同)
  • @CraigTreptow,这是通常的数学约定。正切函数是从实数到实数的特定函数,如果将参数视为角度(以弧度为单位),则可以从几何角度理解它。要使用度数,通常会写出:“tan 45° = tan (pi/4)”。 (4认同)
  • @CraigTreptow:不,据我在 Hackage 本身的文档中看到的情况来看,还没有。然而,使用弧度,它有一个非常干净的*泰勒展开式*(https://en.wikipedia.org/wiki/Sine#Series_definition),这也是 x86 架构上“fsin”的实现(https:// mudongliang.github.io/x86/html/file_module_x86_id_114.html)。我认为大多数软件库都使用弧度(Java 标准库、.NET 库等)。 (3认同)