Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++中的Frand()被删除时,为什么FoW(PoW(64,1.0/3))返回3,但是打印4?_C++_C++11_Debugging_Math - Fatal编程技术网

当C++中的Frand()被删除时,为什么FoW(PoW(64,1.0/3))返回3,但是打印4?

当C++中的Frand()被删除时,为什么FoW(PoW(64,1.0/3))返回3,但是打印4?,c++,c++11,debugging,math,C++,C++11,Debugging,Math,我需要找到给定数字x的第n根。x可以大到1e12,n可以大到50。floorpow64,1.0/3返回3,请帮助我解决此问题,如果没有,请您提出一个替代方案,并牢记这一点? 编辑:我知道它是关于浮点精度的,我想问的是在这种情况下应该有什么替代方案。 即使下面的代码也返回True 双x=pow64,1.0/3; 返回x==intx; 您正在处理传统的浮点不精确问题。请参阅,特别是,以获得为什么std::pow的结果特别不精确的深入解释。由于舍入错误,您偶尔会得到一个稍微小于4的结果,因此std::

我需要找到给定数字x的第n根。x可以大到1e12,n可以大到50。floorpow64,1.0/3返回3,请帮助我解决此问题,如果没有,请您提出一个替代方案,并牢记这一点? 编辑:我知道它是关于浮点精度的,我想问的是在这种情况下应该有什么替代方案。 即使下面的代码也返回True 双x=pow64,1.0/3; 返回x==intx;

您正在处理传统的浮点不精确问题。请参阅,特别是,以获得为什么std::pow的结果特别不精确的深入解释。由于舍入错误,您偶尔会得到一个稍微小于4的结果,因此std::floor将舍入到3

我在上面链接的答案是:

pow的高质量实现将为其结果提供1 ULP的准确性,而最佳实现将“保证”0.5 ULP

这里的ULP指的是最后一个位置的or单元。了解此错误后,可以在调用std::floor之前增加std::pow结果。这样做的一个好方法是使用,它将为您提供下一个更大的可表示浮点值,即1 ULP以上。我认为,如果Pascal关于std::pow精度的陈述成立,那么在您的特定示例中,调用nextafter一次应该会使您返回到4以上。以下是我推荐的代码:

template <typename T>
T floorroot2(T x, T e)
{
  const auto r = std::pow(x, T(1.0)/e);
  return std::floor(std::nextafter(r, r+1));
}

这对我来说是可行的,但如果您不信任库的pow实现,您可能需要添加2个ULP,即调用NextAfterNextAfter,r+1,r+1。

因为3.99999999的楼层是3而不是4。将结果视为十进制而不是整数,1.0/3也不是三分之一。浮点数只是实数的近似值。这就是为什么我要求提供一个替代方案:/替代方案是了解什么浮点数是十进制实数的二进制表示,因此它们是近似值,正如前面所述。这取决于你认识到这一点,并相应地重新安排你的计算。到底什么是潜在的响应。周围的问题?为什么要排除使用roundpow64,1.0/3来获取与结果最接近的整数?
4
3
4
template <typename T>
T floorroot2(T x, T e)
{
  const auto r = std::pow(x, T(1.0)/e);
  return std::floor(std::nextafter(r, r+1));
}