gpt4 book ai didi

C++ 使用 epsilon 比较 double

转载 作者:行者123 更新时间:2023-11-30 02:21:51 26 4
gpt4 key购买 nike

我为使用 epsilon 的 double 定义了一个比较函数,如以下建议:What is the most effective way for float and double comparison? .如果两个 double 的绝对差小于 epsilon,则它们不同。

如果我有 double d1 和 d2,其中 d2 = d1+epsilon,d1 不应等于 d2,因为它们相差 epsilon。对吧?

它适用于某些值,但并非始终有效。它可能与体系结构或编译器有关?我应该怎么做才能提高我的比较功能?

#include <iomanip>  // For std::setprecision
#include <iostream>
#include "math.h" // For fabs

const double epsilon = 0.001;

bool equal(const double &d1, const double &d2)
{
return fabs(d1-d2) < epsilon;
}

int main()
{
double d1 = 3.5;
double d2 = d1+epsilon;

// d2 = d1 + epsilon should not be equal to d1.
std::cout << std::setprecision(16) << "d1 = " << d1 << " d2 = " << d2 << std::endl;
bool eq = equal(d1,d2);
if (eq)
{
std::cout << "They should not be equal, but they are!" << std::endl;
}
else
{
std::cout << "They are not equal. OK!" << std::endl;
}
}

我机器上的输出:

d1 = 3.5 d2 = 3.501

They should not be equal, but they are!

最佳答案

最常见的 float 警告之一:如果您将一个数字放入 float ,并不意味着它会被存储为完全相同的值。相反,它们将被略微修改以创建最接近您的预期值的二进制结构。

好了,言归正传!尝试将此添加到您的源代码中:

std::cout << fabs(d1-d2) << std::endl;

并找到如下输出:)

0.0009999999999998899

你看到了吗?它显然小于您的 epsilon。

关于C++ 使用 epsilon 比较 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com