f# - F# 中带有浮点迭代器的列表推导式

标签 f# floating-point list-comprehension

考虑以下代码:

let dl = 9.5 / 11.
let min = 21.5 + dl
let max = 40.5 - dl

let a = [ for z in min .. dl .. max -> z ] // should have 21 elements
let b = a.Length

“a”应该有 21 个元素,但只有 20 个元素。缺少“max - dl”值。我知道 float 并不精确,但我希望 F# 可以处理它。如果不是,那么为什么 F# 支持带有浮点迭代器的列表推导式?对我来说,这是错误的来源。

在线试用:http://tryfs.net/snippets/snippet-3H

最佳答案

转换为小数并查看数字,第 21 项似乎会“超出”最大值:

let dl = 9.5m / 11.m
let min = 21.5m + dl
let max = 40.5m - dl

let a = [ for z in min .. dl .. max -> z ] // should have 21 elements
let b = a.Length

let lastelement = List.nth a 19
let onemore = lastelement + dl
let overshoot = onemore - max

这可能是由于 let dl = 9.5m/11.m 缺乏精度?

要消除这种复合错误,您必须使用另一种数字系统,即 Rational。 F# Powerpack 附带了一个 BigRational 类,可以像这样使用:

let dl = 95N / 110N
let min = 215N / 10N + dl
let max = 405N / 10N - dl

let a = [ for z in min .. dl .. max -> z ] // Has 21 elements
let b = a.Length

关于f# - F# 中带有浮点迭代器的列表推导式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5429501/

相关文章:

Python 用逗号连接字符串列表,但有一些条件 - 代码重构

arrays - F# : iterate through int array

generics - F# 泛型和转换

python - Python负指数与除法

python - 从类定义中的列表理解访问类变量

python - 过滤器和列表理解之间的区别

f# - 如何编写通用数字的函数?

unit-testing - 使用 RGR 方法时,属性测试是否应该与单元测试一起运行?

floating-point - 如何在软件中模拟浮点运算?

linux - 配置 linux 输出流