Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双重赋值改变值_C++_C++11_Double - Fatal编程技术网

C++ 双重赋值改变值

C++ 双重赋值改变值,c++,c++11,double,C++,C++11,Double,将存储在变量a中的双精度值分配给变量B会在值低于0.000001时改变其值。我读过关于80位FPU的问题,但在这种情况下,这个问题不应该发生,因为我只是赋值,而不是用它来计算。 下面是一些示例代码: double elapsed = _sinceCreation.elapsed(); if ( benchmark->minTime > elapsed ) { benchmark->minTime = elapsed; } benchmark->minTime应该等于\u

将存储在变量a中的双精度值分配给变量B会在值低于0.000001时改变其值。我读过关于80位FPU的问题,但在这种情况下,这个问题不应该发生,因为我只是赋值,而不是用它来计算。 下面是一些示例代码:

double elapsed = _sinceCreation.elapsed();
if ( benchmark->minTime > elapsed ) {
   benchmark->minTime = elapsed;
}
benchmark->minTime
应该等于
\u sinceCreation.appeased()
,但令人惊讶的是它竟然不等于!这可能是什么原因?我如何纠正这种行为

编辑:

为了完成我的解释,这里是一个行为怪异的方法(包括验证相等性的测试输出):

double appeased=\u sinceCreation.appeased();
if(_benchmarkMap.find(benchmark->methodName)==_benchmarkMap.end()){
_benchmarkMap[benchmark->methodName]=基准;
}
如果(benchmark->times.size()>=\u benchmarkLimitPerMethod||
benchmark->times.size()>=benchmark->times.max\u size()){
benchmark->times.pop_front();
基准->MaxSizeRached=true;
}
基准->时间。推回(已过);
如果(基准->分钟时间>已过){
std::cout minTime,经过)minTime=经过;
std::cout minTime,已用)maxTime<已用)
基准->最大时间=已用时间;

\u sinceCreation
是一个时间戳类,自上次
setCurrentTime()和
printToString()以来返回双秒
是fmtlib自己的包装。

这都是关于精度的。double也有一个有限的精度。如果超出这个范围,值就会损坏。不管你是否计算任何东西,赋值仍然是一个操作,值会通过处理器寄存器,因为太“大”是被截断的

,所以我应该使用长双精度
来提高精度?你可以尝试,但要知道,总有一个限制。我还想补充一点,一些看起来很容易用十进制表示的数字很难用二进制表示。例如,.1似乎很容易用十进制表示。它是基本单位,而用二进制表示则是wo用.5、.25、.125…和令人厌恶的位进行运算。表示.1在IEEE格式中表示为00111101111001。此值等于0.100000014901119384765625,而不是.1。请参阅:@Constantin Iliescu我试过了,它没有帮助。无论如何,赋值操作不应该改变精度,如果该值从64位分配到64位。精度可能会根据硬件浮点支持的位宽度而改变。从64位到其他位大小(更大或更小)的转换将影响精度。请提供一个示例。您没有说明如何确定值不相等。这是一大堆“推送”和“弹出”值来证明这些值不相等。我希望在赋值之后有一行简单的代码,比如
if(benchmark->mintime==appeased){ok}或者{what!!??}
@PaulMcKenzie“push”和“popping”与证明无关。我只是粘贴了整个方法,以防万一你也想看到它!但是,在两行上,两个值都是相同的,而在第一行上,值是!=0,在第二行中,值是==0,并且没有其他变量。必须对这种行为进行解释吗?
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;