将变量A中存储的double值赋值给变量B,一旦值低于0.000001,就会改变它的值。我已经读过有关80位FPU的问题,但在这种情况下,不应该出现这个问题,因为我只是分配一个值,而不是用它计算一些东西。 以下是一些示例代码:
double elapsed = _sinceCreation.elapsed();
if ( benchmark->minTime > elapsed ) {
benchmark->minTime = elapsed;
}
benchmark->minTime
应该等于_sinceCreation.elapsed()
,但令人惊讶的是它没有!这可能是什么原因?我该如何解决这个问题?
修改
要完成我的解释,这里是一个行为奇怪的方法(包含测试输出以验证相等性):
double elapsed = _sinceCreation.elapsed();
if ( _benchmarkMap.find(benchmark->methodName) == _benchmarkMap.end() ) {
_benchmarkMap[benchmark->methodName] = benchmark;
}
if ( benchmark->times.size() >= _benchmarkLimitPerMethod ||
benchmark->times.size() >= benchmark->times.max_size() ) {
benchmark->times.pop_front();
benchmark->maxSizeReached = true;
}
benchmark->times.push_back( elapsed );
if ( benchmark->minTime > elapsed ) {
std::cout << printToString("before min time: {0:0.15f} elapsed: {0:0.15f}", benchmark->minTime, elapsed) << std::endl;
benchmark->minTime = elapsed;
std::cout << printToString("after min time: {0:0.15f} elapsed: {0:0.15f}", benchmark->minTime, elapsed) << std::endl;
}
if ( benchmark->maxTime < elapsed )
benchmark->maxTime = elapsed;
_sinceCreation
是一个时间戳类,自上次setCurrentTime()
后返回两秒,printToString()
是fmtlib自己的包装器。
答案 0 :(得分:0)
关于精确度。双精度也有限。如果超出此范围,则该值已损坏。如果你计算任何东西都不重要,分配一个值仍然是一个操作,值通过处理器寄存器,因为太大了#34;大&#34;被截断