考虑以下代码:
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# 支持带有浮点迭代器的列表推导式?对我来说,这是错误的来源。
最佳答案
转换为小数并查看数字,第 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/