You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中表达式[0.1..1]返回[0.1,1.1]的原因是什么?

Haskell 浮点数区间[0.1..1]返回结果异常的原因解释

这个现象是Haskell对浮点类型的Enum实例的规则设计和浮点数特性共同导致的,具体逻辑如下:

  • 首先明确区间语法的默认规则:Haskell的区间语法[a..b]属于Enum类型类的enumFromTo方法调用,对于所有未明确指定步进的区间,默认步进值为该类型下toEnum 1的对应值,浮点类型的对应值就是1.0。
  • 按照默认步进计算,你的表达式生成的元素序列为:0.1、0.1+1.0=1.1、1.1+1.0=2.1...
  • 浮点区间的截断规则和整数不同:整数区间会直接截断所有大于上界b的元素,但浮点区间为了弥补浮点数精度误差带来的截断问题,会将判断阈值放宽到b + 步进/2,也就是本例中的1 + 0.5 = 1.5。因此1.1 ≤ 1.5会被保留,下一个元素2.1 > 1.5被截断,最终得到结果[0.1, 1.1]。

正确实现需求的方案

如果你想要生成0.1, 0.2 ... 1.0的等差数列,有两种更稳妥的写法:

  • 明确指定区间的第二个元素来确定步进:[0.1, 0.2 .. 1],这种写法需要注意浮点数精度误差可能导致最后一个元素和预期的1.0有微小偏差。
  • 用整数区间生成后做数值转换,完全规避精度问题:map (/ 10) [1 .. 10],生成结果会完全符合预期。

内容的提问来源于stack exchange,提问作者renW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:39:04