c#中的快速ArcSin实现或近似

时间:2016-12-01 18:16:29

标签: c# math

我需要在我的项目中多次计算ASin。在C#中需要花费很多时间。

我使用System namespace

中的Math.Asin()

问题是有什么方法可以在C#中更快地实现Asin功能。

任何近似算法或其他可以更快工作的实现?

1 个答案:

答案 0 :(得分:1)

在评论和测试基准之间进行了一些争论后,很明显我在下面给出的解决方案并没有真正改善System.Math.Asin()的性能。实际上,这两个调用几乎可以忽略不计,不应对任何应用程序产生巨大影响。如果您遇到性能问题,您的原因可能是以下之一:

  1. 你的arcsin电话实际上并不是瓶颈。您需要对应用程序进行概要分析以确定瓶颈。过早优化是一个常见错误,可能会浪费大量时间。
  2. 你多次调用这个函数。您可能有多次调用函数的正当理由,但调用可能会被优化为更高级别。可能的解决方案是使用并行调用或更改操作顺序以减少调用。如果您正在调用类似y = sin(x); z = asin(y)的内容,那么您将进行额外的不必要的调用。这是一个简单的例子,但更复杂的计算可以在数学上产生类似的效果。
  3. 你在不应该的地方调用这个功能。例如,如果您尝试在GUI或渲染线程中进行计算,那么您将遇到性能问题并且缺乏响应能力。这是一个常见的设计错误,应该注意的是,计算不应该在GUI线程中完成。
  4. 您的使用案例不可行。如果您正在进行实时数据转换和可视化等操作,那么您可以实时处理多少数据的上限。这取决于硬件,除了将计算卸载到具有更多处理能力的地方之外,没有太多可以做的事情。像这样的案例就是云计算可以派上用场的地方。
  5. 这些要点,下面的解决方案仍然是C#优化的有效途径。请注意,在分析应用程序之前不应该进行优化,因此您实际上知道瓶颈是您认为的瓶颈。请注意,这不是优化的唯一途径。并行处理或选择不同算法等路径也是有效的。

    有点不同的解决方案,但您可以尝试使用this question的答案加载C标准库。 Windows上的C标准库为msvcrt.dll,应包含函数asin

    [DllImport("msvcrt.dll", EntryPoint="asin",
    ExactSpelling=false, CharSet=CharSet.Unicode,
    SetLastError=true)]
    static extern double asin(double radians);
    
    //calling the function
    static void Main()
    {
        double x = asin(0);
    }
    

    如果这仍然不够快,你可以在C中编写一个快速的asin算法。有this question,与你的类似。您还可以创建一个更快的平方根函数,以便在此解决方案中使用。

    根据您需要的准确度,如果您的角度接近0,您也可以进行泰勒级数近似。您也可以将角度移近零,但这需要一点点更多的诡计。