双重分配改变了价值

时间:2017-07-19 16:07:30

标签: c++ c++11 double

将变量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自己的包装器。

1 个答案:

答案 0 :(得分:0)

关于精确度。双精度也有限。如果超出此范围,则该值已损坏。如果你计算任何东西都不重要,分配一个值仍然是一个操作,值通过处理器寄存器,因为太大了#34;大&#34;被截断