我有一个问题,我正在做一些关于它是如何工作的个人研究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
有关如何解决问题的任何想法?我最好的猜测是它的漂浮问题。 (但现在我知道这是我的错误)
答案 0 :(得分:8)
操作的变量声明为int,因此操作在整数上完成,结果只转换为double。
要获得双重结果,您可以这样做:
dRes = (double)x / y;
顺便说一下,有一种更好的方法来测试代码的运行时间:
Stopwatch sw = Stopwatch.StartNew();
// ... Some code
sw.Stop();
Console.WriteLine(sw.Elapsed);
答案 1 :(得分:4)
这不是float
问题;这是一个int
问题。在分割之前,您需要将err
投射到double
。
Console.WriteLine("Error: " + 100 * ((double)err / c) + "%");