相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

<快于<=?

我正在读一本书,作者说这if( a < 901 )比书更快if( a <= 900 ).

与此简单示例不完全相同,但循环复杂代码略有性能变化.我想这必须对生成的机器代码做一些事情,以防它甚至是真的.

c++ performance assembly relational-operators

1508
推荐指数
12
解决办法
12万
查看次数

浮动和双重比较最有效的方法是什么?

比较两个double或两个float值的最有效方法是什么?

简单地这样做是不正确的:

bool CompareDoubles1 (double A, double B)
{
   return A == B;
}
Run Code Online (Sandbox Code Playgroud)

但是像这样:

bool CompareDoubles2 (double A, double B) 
{
   diff = A - B;
   return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)

似乎浪费处理.

有谁知道更聪明的浮动比较器?

c++ algorithm floating-point optimization

495
推荐指数
13
解决办法
39万
查看次数

重新考虑浮点比较

这个主题在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
查看次数