相关疑难解决方法(0)

我们应该将浮点数与相对*误差进行比较吗?

到目前为止,我已经看到很多关于浮点数相等的帖子.对于"我们应该如何决定x和y是否相等?"这样的问题的标准答案.是

abs(x - y) < epsilon
Run Code Online (Sandbox Code Playgroud)

其中epsilon是一个固定的小常数.这是因为"操作数"x和y通常是涉及舍入误差的某些计算的结果,因此标准相等运算符==不是我们的意思,我们应该问的是x和y是否接近,不相等.

现在,我觉得如果x与y"几乎相等",那么x*10 ^ 20也应该与y*10 ^ 20"几乎相等",因为相对误差应该是相同的(但是"相对的" "到底是什么?" 但是对于这些大数字,上述测试将失败,即该解决方案不会"扩展".

你会如何处理这个问题?我们应该重新调整数字还是重新调整epsilon?怎么样?(或者我的直觉是错的吗?)

这是一个相关的问题,但我不喜欢它接受的答案,因为reinterpret_cast对我来说似乎有点棘手,我不明白发生了什么.请尝试提供简单的测试.

language-agnostic math floating-point comparison

15
推荐指数
2
解决办法
4963
查看次数

if(double)是否有效的C++?

我刚碰到这行代码:

if( lineDirection.length2() ){...}
Run Code Online (Sandbox Code Playgroud)

哪里length2返回一个double.让我感到困惑的是,0.0等于0 NULL,和/或false.

这是C++标准的一部分还是未定义的行为?

c++ floating-point implicit-conversion

10
推荐指数
3
解决办法
6173
查看次数

比较两个花车

#include <stdbool.h>

bool Equality(double a, double b, double epsilon)
{
  if (fabs(a-b) < epsilon) return true;
  return false;
}
Run Code Online (Sandbox Code Playgroud)

我试过这种方法比较两个双打,但我总是遇到问题,因为我不知道如何选择epsilon,实际上我想比较小数字(小数点后6位数),如0.000001.我尝试了一些数字,有时候我会得到0.000001 != 0.000001,有时0.000001 == 0.000002 除了与epsilon比较之外还有其他方法吗?

我的目的是比较两个双打(代表我的情况下的时间).表示以毫秒为单位的时间的变量t是double.它增加另一个函数0.000001然后0.000002等每次t改变,我想检查它是否等于double tt类型的另一个变量,如果tt == t,我有一些指令要执行..
谢谢你的救命

c comparison

10
推荐指数
2
解决办法
3万
查看次数

对于浮点值a:a*0.0 == 0.0对于a的有限值是否始终求值为true?

我总是假设以下测试将始终成功获得有限值(无INF,无NAN)somefloat:

assert(somefloat*0.0==0.0);
Run Code Online (Sandbox Code Playgroud)

Multiply by 0优化中,它表明double a=0.0并且double a=-0.0严格来说并不是相同的事情.

所以我想知道这是否会导致某些平台出现问题,例如上述测试的结果是否取决于a正面还是负面.

c c++ floating-point ieee-754

10
推荐指数
1
解决办法
580
查看次数

物理引擎:使用双精度还是单精度?

我从零开始制作一个刚体物理引擎(用于教育目的),我想知道我是否应该为它选择单精度或双精度浮点数.

我将使用OpenGL对其进行可视化,并使用glm库来计算引擎内部以及可视化内容.惯例似乎是在任何地方使用浮动OpenGL,glm::vec3并且glm::vec4似乎在float内部使用.我也注意到有glm::dvec3,glm::dvec4但似乎没有人使用它.我该如何决定使用哪个?double似乎有意义,因为它在今天的硬件上具有更高的精度和几乎相同的性能(据我所知),但float 除了一些GLu的功能和一些GLFW 之外,其他一切似乎都在使用.

c++ opengl simulation floating-point floating-accuracy

10
推荐指数
2
解决办法
2629
查看次数

比较IEEE浮点数和双精度数是否相等

比较IEEE浮点数和双精度数据的最佳方法是什么?我听说过几种方法,但我想看看社区的想法.

variables floating-point inequality

9
推荐指数
1
解决办法
5077
查看次数

STL,BOOST中的浮点比较

在STL或Boost中是否有一组通用的简单比较函数?

我发现的那个总是需要模板参数和/或结构模板的实例化.

我正在寻找具有如下语法的东西:

if ( is_equal(x,y) )
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

哪个可以实现为:

template <typename T>
bool is_equal(const T& x, const T& y)
{
    return ( fabs(x - y) < Precision<T>::eps );
}
Run Code Online (Sandbox Code Playgroud)

编辑:我将运算符更改为相等.(见下面的评论)

c++ floating-point

9
推荐指数
1
解决办法
6656
查看次数

gcc精确错误?

我只能假设这是一个错误.第一个断言在第二个失败时通过:

double sum_1 =  4.0 + 6.3;
assert(sum_1 == 4.0 + 6.3);

double t1 = 4.0, t2 = 6.3;

double sum_2 =  t1 + t2;
assert(sum_2 == t1 + t2);
Run Code Online (Sandbox Code Playgroud)

如果不是错误,为什么?

precision gcc

8
推荐指数
2
解决办法
1596
查看次数

使用==运算符比较两个舍入的浮点数是否正确?

或者操作是否有可能失败?

谢谢.

我选择了错误的术语,我真正的意思是四舍五入到0,而不是截断.

关键是,我需要比较两个双精度的整数部分,我只是将它们转换为int然后使用==,但是,正如有人在我之前的一个问题中指出的那样,这可能会引发溢出异常,如果double不能适合整数.

所以问题是'使用==运算符来比较之前舍入为0的两个双精度是否正确,或者我应该坚持使用cast to int方法并捕获可能的异常?

.net floating-point compare rounding

6
推荐指数
2
解决办法
3527
查看次数

这个O(n ^ 4)算法可以避免吗?

免责声明:这不是一个家庭作业问题.我甚至不上学.

#include <stdio.h>
void printIntersect(float, float, float, float);

int main(){
   int x, y, z, a;
   float slopes[] = {5, 9, 4/3.0f, 2/3.0f, 3};
   float inter[] = {3, 2, 1, 0, 5/3.0f};  

   for(x = 0; x < (sizeof(slopes) / sizeof(slopes[0])) - 1; x++)
       for(y = 1; y < (sizeof(slopes) / sizeof(slopes[0])); y++)
           for(z = 0; z < sizeof(inter) / sizeof(inter[0]); z++)
                  for(a = 0; a < sizeof(inter) / sizeof(inter[0]); a++)
                      if(slopes[x] != slopes[y])
                          printIntersect(slopes[x], slopes[y], inter[z], inter[a]);

   return 0;
}

void …
Run Code Online (Sandbox Code Playgroud)

c arrays

6
推荐指数
1
解决办法
199
查看次数