比较两个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)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
我知道因UIKit使用CGFloat分辨率独立坐标系而使用.
但我想,以检查是否例如每次frame.origin.x是0它让我感到恶心:
if (theView.frame.origin.x == 0) {
// do important operation
}
Run Code Online (Sandbox Code Playgroud)
是不是CGFloat有比较时容易误报==,<=,>=,<,>?这是一个浮点,他们有不寻常的问题:0.0000000000041例如.
Objective-C在比较时是在内部处理这个,还是可能发生origin.x读取为零的情况并不是0真实的?
我想检查某个模板专业化是否存在,其中一般情况没有定义.
鉴于:
template <typename T> struct A; // general definition not defined
template <> struct A<int> {}; // specialization defined for int
Run Code Online (Sandbox Code Playgroud)
我想定义一个像这样的结构:
template <typename T>
struct IsDefined
{
static const bool value = ???; // true if A<T> exist, false if it does not
};
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点(理想情况下没有C++ 11)?
谢谢
if (std::abs(double1 - double2) < std::numeric_limits<double>::epsilon())
std::cout<<"Equal";
else
std::cout<<"Not equal";
Run Code Online (Sandbox Code Playgroud)
这段代码与现代 C++11/14/17/21 仍然是我们比较 float 和 double 的方式吗,或者现在只需编写就可以了
if (double1 == double2)
Run Code Online (Sandbox Code Playgroud)
编译器会为我们处理 epsilon 问题吗?
顺便说一句:在检查 epsilon 时,写 < 或 <= 更好吗?
我知道如何检查两个浮点数是否almost相等,简单代码:
bool compare(double a, double b)
{
if(fabs(a - b) < (1.0 / 10000000))
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是当我有一些随机数据时,让我们说9.0和9.5,或者9.4我希望将它们视为相同数字,如何做到这一点?我的意思是,他们不相等,但我可以允许一些小错误+/- 0.5.有任何想法吗?
有了这个错误,我可以处理数字:
9.1 and 9.0
3.1 and 3.6
-4.2 and -4.6
Run Code Online (Sandbox Code Playgroud)
平等的
c++ ×3
c ×2
algorithm ×1
c++11 ×1
ios ×1
objective-c ×1
optimization ×1
sfinae ×1
templates ×1