我如何优化此算法以近似pi?

时间:2015-11-07 00:45:39

标签: c# math pi

我对编码很缺乏经验,但我设法写了这个:

    var query = PFQuery(className:"SearchPreferences")
    query.getObjectInBackgroundWithId("musicSearch") {
        (searchPreference: PFObject?, error: NSError?) -> Void in
        if error != nil {
            print(error)
        } else if let searchPreference = searchPreference {
            searchPreference["musicSearch"] = self.table_data[indexPath.row]
            searchPreference.saveInBackground()
        }
    }

蒙特卡罗原则很简单;我计算y值 对于曲线f(x)= sqrt(r ^ 2 - ix ^ 2),它代表圆的第一个四分之一。然后我计算圆圈内的点并在结束时输出它。 piApprox = 4 *(inanon / allAmount)行的乘法; 来自方形和圆形的比例:
 (pi * r ^ 2)/((2r)^ 2) - >  (pi * r ^ 2)/(4 * r ^ 2) - > pi / 4

我有什么办法可以加快计算速度吗?

1 个答案:

答案 0 :(得分:1)

我认为你是C#的新手,所以我在这里给你一些提示。

有几件事情有待改进:

  • decimal很慢:它使用软件计算。另一方面,intdouble及类似的计算在硬件中实现。在这里使用int,无论如何都不要使用小数部分。
  • Math.Pow很慢。请勿将其用于平方:将Math.Pow(x, 2)替换为x * x
  • Math.Sqrt很慢。不要将Math.Sqrt(x)y进行比较,而是将xy * y进行比较。或者只是在结束时调用一次。
  • Math.Floor :)
  • 您可以使用并行性来利用多核CPU
  • 您应该使用本地变量,因为它们更容易进行优化

请记住,当我的意思是时,相对。所有这些操作在绝对意义上都非常快 - 我只是说你可以使用更快的替代方案。

但是有一件事情是痛苦地缓慢(这对于人来说是显而易见的):Console。它在Windows 10上要好得多,但它仍然很慢,你在代码的热门路径中使用控制台。摆脱这些中间结果。

还有一件事,如果您在分部中使用int,您将在C#中获得int。如果你想获得小数部分(如double中所述),你需要在分割之前将一个操作数转换为(double)x / y