F#使用小数精确计算?

时间:2018-09-28 20:10:16

标签: math f#

我正在尝试使用

这样的浮点数进行精确计算
let pi = double (22/7)

printfn "%f" (cos(2.00*pi*1.00/2.00))
// output: -0.989992

在计算器上我得到-1,因此它可以正确地向上和向下取整,但是,当我在F#中执行此操作时,我得到的结果/输出是:-0.989992,它接近-1,但是如何获得输出-1,因此它正确向上和向下取整?

我试图阅读有关该主题的信息,似乎我需要导入一个模块,这是真的吗?

enter image description here

3 个答案:

答案 0 :(得分:6)

您的计算之所以关闭,不是因为舍入误差,而是因为22/7是π值的非常宽松近似。

  • 22/7 = 3.142857142857 ...
  • π= 3.14159265358979 ...
  • 22/7-π= 0.00126448927 ...

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)

所以这个问题有几个问题。

  1. 其他人指出22/7只是PI的近似值
  2. Aslo,let pi = double(22/7)产生pi = 3.0。这是因为22/7是F#中的整数除法。
  3. 与Wolfram进行比较时,该表达式使用的PI逼近度优于3.0,这意味着F#结果与Wolfram的区别非常明显

当要求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))