0

問題があります。これがどのように機能するかについて個人的な調査を行っていますhttp://www.codeproject.com/Articles/17480/Optimizing-integer-divisions-with-Multiply-Shift-i困惑しているので、コード atm はおよそ 100% のエラーを返すはずです

        double sum = 0, div = 3;
        DateTime t1 = DateTime.Now;
        List<double> l1 = new List<double>();
        for (int a = 0; a < 10000000; a++)
        {
            sum = a / div;
            l1.Add(sum);
        }
        Console.WriteLine("Milisecond: " + DateTime.Now.Subtract(t1).TotalMilliseconds);
        t1 = DateTime.Now;
        List<double> l2 = new List<double>();
        for (int a = 0; a < 10000000; a++)
        {
            sum = a * div;
            l2.Add(sum);
        }
        Console.WriteLine("Milisecond: " + DateTime.Now.Subtract(t1).TotalMilliseconds);
        int c=0;
        int err = 0;
        for (int a = 0; a < (l1.Count < l2.Count ? l1.Count : l2.Count); a++)
        {
            c++;
            err += l1[a] != l2[a] ? 1:0;
        }
        Console.WriteLine("Error: " + 100*(err / c) + "%");

しかし、その最後の行は明らかに 0 を返します 9999999 / 10000000 = 0

問題を回避する方法についてのアイデアはありますか? 私の最善の推測は、それがフロートの問題であるということです。(しかし、今ではそれが私の側のエラーであることを知っています)

4

2 に答える 2

8

操作の変数は int として宣言されているため、操作は整数に対して行われ、結果は double に変換されます。

二重の結果を得るには、次のようにします。

dRes = (double)x / y;

ところで、コードの実行時間をテストするためのより良い方法があります。

Stopwatch sw = Stopwatch.StartNew();

// ... Some code

sw.Stop();
Console.WriteLine(sw.Elapsed);
于 2013-06-15T10:01:47.660 に答える