【问题标题】:Is there a difference between floor and truncate in HaskellHaskell 中的 floor 和 truncate 有区别吗
【发布时间】:2017-08-22 07:46:20
【问题描述】:

floortruncate 在 Haskell 中的功能是否存在差异?

它们似乎执行相同的功能并且具有相同的类型签名:

  • truncate :: (Integral b, RealFrac a) => a -> b
  • floor :: (Integral b, RealFrac a) => a -> b

【问题讨论】:

  • 总 Haskell 新手,但与大多数其他语言一样,您可能会看到负数的不同......
  • 这确实是我的问题。 :) 谢谢!

标签: haskell


【解决方案1】:

是的,对于负数。如果我们阅读文档,我们会看到:

truncate :: Integral b => a -> b

truncate x 返回在零和x 之间最接近x 的整数

和:

floor :: Integral b => a -> b

floor x返回不大于x的最大整数

所以如果我们输入一个负数,比如-3.5,我们会得到:

Prelude> truncate (-3.5)
-3
Prelude> floor (-3.5)
-4

【讨论】:

  • 感谢您的明确回答和对文档的参考。我确实只是用正数来验证它。
【解决方案2】:

它不是特定于 haskell 的,但这些函数之间存在差异。楼层表示不大于给定数字的最高整数。截断意味着删除某个长度,在这种情况下是小数部分。这些对于零和正数具有相同的效果,但不是负数。

以下是 Python 中的快速比较:

>>> for i in range(-5,6):
...   j=0.5*i
...   print(j,floor(j),ceil(j),trunc(j),round(j))
...
-2.5 -3 -2 -2 -2
-2.0 -2 -2 -2 -2
-1.5 -2 -1 -1 -2
-1.0 -1 -1 -1 -1
-0.5 -1 0 0 0
0.0 0 0 0 0
0.5 0 1 0 0
1.0 1 1 1 1
1.5 1 2 1 2
2.0 2 2 2 2
2.5 2 3 2 2

本质上 trunc() 趋向于零,而 floor() 趋向于负无穷大。

【讨论】:

    【解决方案3】:

    查看源代码很快就会发现差异:

    truncate x          =  m  where (m,_) = properFraction x
    

    floor x             =  if r < 0 then n - 1 else n
                           where (n,r) = properFraction x
    

    我们看到差异只会出现在负数上,所以:

    Prelude> floor (negate 2.1)
    -3
    Prelude> truncate (negate 2.1)
    -2
    

    【讨论】:

      【解决方案4】:

      截断:

      1    -->  1 
      3.1  -->  3
      3.9  -->  3
      -2.1 --> -2
      -2.9 --> -2
      

      楼层:

      1    -->  1 
      3.1  -->  3
      3.9  -->  3
      -2.1 --> -2
      -2.9 --> -3 (Different!...)
      

      【讨论】:

      • 注意floor (-2.1)-3
      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 2010-09-13
      • 2021-12-17
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-06-27
      • 2010-12-21
      相关资源
      最近更新 更多