相关疑难解决方法(0)

重新考虑浮点比较

这个主题在StackOverflow上出现了很多次,但我相信这是一个新的看法.是的,我已经阅读了布鲁斯道森的文章每个计算机科学家应该知道的关于浮点算术的内容这个很好的答案.

据我了解,在一个典型的系统上,比较浮点数是否相等有四个基本问题:

  1. 浮点计算不准确
  2. 无论a-b是"小"取决于规模ab
  3. 是否a-b为"小"取决于类型ab(例如浮动,双,长双)
  4. 浮点通常具有+ -infinity,NaN和非规范化表示,其中任何一个都可能干扰天真的公式

这个答案 - 又名."Google方法" - 似乎很受欢迎.它确实处理了所有棘手的案件.并且它确实非常精确地缩放比较,检查两个值是否在彼此的固定数量的ULP内.因此,例如,非常大的数字将"几乎相等"与无穷大相比较.

然而:

  • 在我看来,它非常混乱.
  • 它不是特别便携,严重依赖于内部表示,使用union来从float中读取位等.
  • 它只处理单精度和双精度IEEE 754(特别是没有x86长双)

我想要类似的东西,但使用标准的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)

c++ floating-point ieee-754 language-lawyer

26
推荐指数
1
解决办法
3690
查看次数

两个一般的CS问题

当比较两个"真实"数字是否相等时,为什么我不应该使用==运算符,而我应该使用什么呢?

coersion和cast之间有什么区别?我的一般假设是,当你强制一个值为另一种类型时,如下所示:

int n = 9;
return double(n)/5;
Run Code Online (Sandbox Code Playgroud)

c++ floating-point

5
推荐指数
1
解决办法
441
查看次数

标签 统计

c++ ×2

floating-point ×2

ieee-754 ×1

language-lawyer ×1