gpt4 book ai didi

Haskell floor 函数返回不同的结果

转载 作者:行者123 更新时间:2023-12-03 14:57:27 25 4
gpt4 key购买 nike

我有一个关于 Haskell 的问题 floor函数 - 它应该返回“不大于参数的最大整数”,但表达式
floor 3.9999999999999999
返回 4 而不是 3。它可能与 Double 有关类型精度,但考虑到 Haskell 类型安全的重要性,它不应该编译,无论如何,在这种情况下,它返回的数字大于与其定义相矛盾的参数。

最佳答案

in this case it returns the number greater than the argument which contradicts its definition.



它返回一个等于其参数的数字。正如你所说,这是关于 double 。在 64 位浮点规则下,数字 3.9999999999999999 和 4 完全相等。

but then it shouldn't compile given the importance of Haskell type safety



问题是像这样的分数文字具有多态类型 Fractional a => a .那就是他们不必是 double 。例如,您可以写 floor (3.9999999999999999 :: Rational) ,它将正确返回 3,因为 3.9999999999999999 可以表示为 Rational没有任何精度损失。

如果 Haskell 将 3.9999999999999999 写入错误,那么你也不能写 3.9999999999999999 :: Rational ,这会很糟糕。所以自从一个 Fractional字面量可以用许多不同的类型来表示,其中一些具有无限精度,Haskell 限制合法 Fractional 的数量是一个很大的错误。基于 Double 的文字的局限。

有人可能会争辩说 Haskell 应该限制 3.9999999999999999当用作 Double ,但在使用 Rational 时不会.然而,这需要 Fractional 的实例。类型类来声明有关其精度的信息(以便 Haskell 可以使用该信息来确定给定的文字是否对该类型有效),它目前没有,并且很难(或不可能)以一般、高效的方式实现和用户友好的方式(考虑到术语“精度”可能意味着完全不同的东西,这取决于我们是在谈论浮点数还是定点数,以及它们是使用基数 2 还是 10(或其他任何东西)来表示数字 - 对于 Fractional 类型类的实例,其中任何一个都是可能的)。

关于Haskell floor 函数返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com