编程中的数学计算

时间:2011-08-21 05:33:37

标签: math

我正在努力进行有关多线程的演示。我需要一个计算密集型函数/方法的例子。但与此同时,执行计算的代码应该很简单。

例如,我正在寻找一个函数,可能会像计算pi或e的第n位一样:

function calculatePiToNthDecimalDigit(digits) {
    var pi = "3.";

    for (var i = 1; i < digits; i++) {
        pi += digitOfPiAtDecimalPlace(i);
    }

    return pi;
}

function digitOfPiAtDecimalPlace(decimalPlace) {
    ...
}

任何人都可以给我一个相对简单的函数示例但可以连续使用(例如紧密循环)以生成非常难以计算(需要很长时间)的值吗?

3 个答案:

答案 0 :(得分:0)

我能想到的最简单的方法是总结一大堆数字。添加显然很容易,但如果列表很大,那将使计算密集,并且问题很适合多线程。

答案 1 :(得分:0)

真正的测试来自真正的问题。如何使用简单的公式(例如trapezoidal rule

)对函数进行数值积分

让我们尝试使用C#

来证明Integral sin(x)
void Main(string[] args)
{
    int N = 2097153;
    double two = Integral(0, Math.PI, N);
    double err = (2.0 - two) / 2.0;
    Console.WriteLine("N={0} err={1}", N, err);
}
double f(double x) { return Math.Sin(x); }
double Integral(double a, double b, int N)
{
    double h = (b - a) / N;
    double res = (f(a) + f(b)) / 2;
    for (int j = 1; j < N; j++)
    {
        double x = a + j*h;
        res += f(x);
    }
    return h * res;
}

此时我在几毫秒后得到N=2097153err=2.1183055309848E-13。如果你的准确度要高得多,那么随着舍入误差开始蔓延,误差会开始上升。我认为Pi的计算会发生类似的事情,而你会在几毫秒内达到机器精度。除此之外,你真的在​​计算垃圾。您可以多次重复积分以获得更长的整体效果。

所以你可能会显示从140毫秒到90毫秒的时间下降并将其视为胜利。

答案 2 :(得分:0)

两个NxN矩阵的乘法具有与N ^ 3成比例的复杂度,因此仅通过对足够大的矩阵进行平方来创建“计算密集”任务相对容易。例如,当大小从N = 10到N = 100到N = 1000时,经典算法对矩阵乘法所需的(标量)乘法数从一千到一百万到十亿。

如果您的多线程演示旨在利用这些机会,那么此类任务也有很多并行处理的机会。例如。同一行可以并行乘以多个列。