这个主题在StackOverflow上出现了很多次,但我相信这是一个新的看法.是的,我已经阅读了布鲁斯道森的文章和每个计算机科学家应该知道的关于浮点算术的内容和这个很好的答案.
据我了解,在一个典型的系统上,比较浮点数是否相等有四个基本问题:
a-b是"小"取决于规模a和ba-b为"小"取决于类型a和b(例如浮动,双,长双)这个答案 - 又名."Google方法" - 似乎很受欢迎.它确实处理了所有棘手的案件.并且它确实非常精确地缩放比较,检查两个值是否在彼此的固定数量的ULP内.因此,例如,非常大的数字将"几乎相等"与无穷大相比较.
然而:
我想要类似的东西,但使用标准的C++并处理长双打.如果可能的话,我指的是C++ 03,如果需要,我指的是C++ 11.
这是我的尝试.
#include <cmath>
#include <limits>
#include <algorithm>
namespace {
// Local version of frexp() that handles infinities specially.
template<typename T>
T my_frexp(const T num, int *exp)
{
typedef std::numeric_limits<T> limits;
// Treat +-infinity as +-(2^max_exponent).
if (std::abs(num) > limits::max())
{
*exp …Run Code Online (Sandbox Code Playgroud) 当比较两个"真实"数字是否相等时,为什么我不应该使用==运算符,而我应该使用什么呢?
coersion和cast之间有什么区别?我的一般假设是,当你强制一个值为另一种类型时,如下所示:
int n = 9;
return double(n)/5;
Run Code Online (Sandbox Code Playgroud)