到目前为止,我已经看到很多关于浮点数相等的帖子.对于"我们应该如何决定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对我来说似乎有点棘手,我不明白发生了什么.请尝试提供简单的测试.
我刚碰到这行代码:
if( lineDirection.length2() ){...}
Run Code Online (Sandbox Code Playgroud)
哪里length2返回一个double.让我感到困惑的是,0.0等于0 NULL,和/或false.
这是C++标准的一部分还是未定义的行为?
#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,我有一些指令要执行..
谢谢你的救命
我总是假设以下测试将始终成功获得有限值(无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正面还是负面.
我从零开始制作一个刚体物理引擎(用于教育目的),我想知道我是否应该为它选择单精度或双精度浮点数.
我将使用OpenGL对其进行可视化,并使用glm库来计算引擎内部以及可视化内容.惯例似乎是在任何地方使用浮动OpenGL,glm::vec3并且glm::vec4似乎在float内部使用.我也注意到有glm::dvec3,glm::dvec4但似乎没有人使用它.我该如何决定使用哪个?double似乎有意义,因为它在今天的硬件上具有更高的精度和几乎相同的性能(据我所知),但float 除了一些GLu的功能和一些GLFW 之外,其他一切似乎都在使用.
比较IEEE浮点数和双精度数据的最佳方法是什么?我听说过几种方法,但我想看看社区的想法.
在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)
编辑:我将运算符更改为相等.(见下面的评论)
我只能假设这是一个错误.第一个断言在第二个失败时通过:
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)
如果不是错误,为什么?
或者操作是否有可能失败?
谢谢.
我选择了错误的术语,我真正的意思是四舍五入到0,而不是截断.
关键是,我需要比较两个双精度的整数部分,我只是将它们转换为int然后使用==,但是,正如有人在我之前的一个问题中指出的那样,这可能会引发溢出异常,如果double不能适合整数.
所以问题是'使用==运算符来比较之前舍入为0的两个双精度是否正确,或者我应该坚持使用cast to int方法并捕获可能的异常?
免责声明:这不是一个家庭作业问题.我甚至不上学.
#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++ ×4
c ×3
comparison ×2
.net ×1
arrays ×1
compare ×1
gcc ×1
ieee-754 ×1
inequality ×1
math ×1
opengl ×1
precision ×1
rounding ×1
simulation ×1
variables ×1