haskell - `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 舍入到任何东西?这对我来说也很奇怪。
有人可以解释一下吗?
解决方案
简而言之:它使用弧度作为角度。您的手机可能设置为使用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
关闭的,这可能是因为您只指定了十位小数。
推荐阅读
- c# - 查找最小值和最大值 - 用于搜索的纬度和经度
- react-native - 关闭 React 本机模式不起作用
- swift - SwiftUI NavigationLink 通过滑动打开
- rest - 如果我不使用它们,是否需要将路径参数放在 URI 中[REST API]
- r - 为什么我的 R 数据框没有被复制到 ifelse 语句中?
- java - Spock setupSpec() 中的@Autowired 变量访问
- python - List.append() 似乎正在重写列表中的值
- python - 将标签分配给其相应的网格单元
- r - 如何使用条件语句作为 R 函数的输入
- powershell - 在 powershell 中获取所有 AzureAD 组的 GroupTree