我正在尝试使用
这样的浮点数进行精确计算let pi = double (22/7)
printfn "%f" (cos(2.00*pi*1.00/2.00))
// output: -0.989992
在计算器上我得到-1,因此它可以正确地向上和向下取整,但是,当我在F#中执行此操作时,我得到的结果/输出是:-0.989992,它接近-1,但是如何获得输出-1,因此它正确向上和向下取整?
我试图阅读有关该主题的信息,似乎我需要导入一个模块,这是真的吗?
答案 0 :(得分:6)
您的计算之所以关闭,不是因为舍入误差,而是因为22/7是π值的非常宽松近似。
Wolfram Alpha使用的π近似值比22/7好得多,因此这就是为什么您的计算显示出与Wolfram Alpha不同的结果的原因。
您应该只使用let pi = double (22/7)
(例如System.Math.PI
)来代替let pi = System.Math.PI
。这样您将获得(cos(2.00*pi*1.00/2.00))
的准确值。不需要四舍五入。
有关更多详细信息,请参见the docs for Math.PI
。
答案 1 :(得分:3)
所以这个问题有几个问题。
let pi = double(22/7)
产生pi = 3.0
。这是因为22/7是F#中的整数除法。当要求Wolfram和F#计算相同的表达式时:cos(3)
,结果如下。
F#:cos 3.0
=> -0.989992496600445
Wolfram:cos(3)
=> -0.98999249660044545727157279473126130239367909661558832881
Wolfram可以计算更多的小数,但是我们看到数字仅相差> 1e-15
当我们问F#和Wolfram他们是什么cos(pi)时:
F#:cos System.Math.PI
=> -1.0
Wolfram:cos(pi)
=> -1
答案 2 :(得分:-1)
我找到了路,对不起!您需要使用System.Math.Round。无需导入任何已内置的东西。
即:System.Math.Round(System.Math.Round(cos((2.00 * pi * 2.00 / 2.00)),0))