我试图预测一个模拟的估计完成时间。我在模拟开始时使用startTime
。在每个周期结束时,我选择timeNow
。经过的时间timeLapsed
是通过减去这两个值来计算的。平均循环时间(每个周期不同)是通过将经过的时间除以当时的循环数,即在此之前运行的周期数来计算的。然后,通过将仍然要去的循环数乘以timeNow
的平均周期时间,计算出估计的完成时间timeNow
。
我认为数据转换有问题,因为estimEndTime
计算是不正确的。它的预测太短了/太快了。平均循环时间avgCycleTime
计算在30-50秒左右,这看起来是正确的.循环试验nr为20。
我收到一个警告,将循环号(int )从int64转换为long,可能会丢失数据,但由于avgCycleTime
似乎没有问题,这似乎不是导致错误的原因。
为什么这个不行?
代码要点:
long avgCycleTime;
DateTime startTime = DateTime::Now;
f1->textBox9->Text = startTime.ToString("dd/MM/yy HH:mm:ss");
f1->textBox9->Update();
i = 0; // cycle counter
while (i < nCycl)
{
// this is where the simulation occurs
i++;
DateTime timeNow = DateTime::Now;
TimeSpan timeLapsed = timeNow.Subtract(startTime);
avgCycleTime = (timeLapsed.Ticks / i);
DateTime estimEndTime = timeNow.AddTicks(avgCycleTime * (nCycl-i));
f1->textBox10->Text = Convert::ToString(avgCycleTime / 10000000); // cycle time in milliseconds
f1->textBox11->Text = estimEndTime.ToString("dd/MM/yy HH:mm:ss");
f1->Refresh();
}
发布于 2014-04-30 12:01:17
问题在于,您将avgCycleTime
声明为long
--实际上是Int32
。假设一个周期需要50秒。在滴答声中,这将是50 * 10,000,000 = 500,000,000
--非常适合于Int32
。然后计算avgCycleTime * (nCycl - i)
并将其溢出(结果为Int32
),从而得到无效的estimEndTime
。因此,您必须声明avgCycleTime
为long long
或Int64
。
https://stackoverflow.com/questions/23396285
复制相似问题