当前位置: 首页 > 知识库问答 >
问题:

现代C++[duplicate]中比较double/float等式的现代实践

阴凯歌
2023-03-14
if (std::abs(double1 - double2) < std::numeric_limits<double>::epsilon())
  std::cout<<"Equal";
else
  std::cout<<"Not equal";
if (double1 == double2)

编译器会为我们处理epsilon的问题吗?

顺便问一句:对照Epsilon检查时写<或<=更好吗?

共有1个答案

白青青
2023-03-14

使用现代C++11/14/17/21的代码是否仍然是我们应该比较float和doubles的方式,或者现在只要编写,如果(double1==double2)和编译器将为我们处理epsilon问题就可以了?

这两种方法在现代C++中的功能与在早期C++中的功能相同。

这两种方法也有缺陷。

与epsilon进行比较时,假设一个合理的舍入误差将小于epsilon常数,这可能是一个错误的假设!

  • 如果您的数字具有大于2.0的数量级,则您的epsilon技巧将与直接比较无异,并且具有相同的缺陷。无论您是使用<还是<=
  • 如果你的数字有相同的符号,且大小比epsilon小,你的epsilon技巧会说它们总是相等的,即使其中一个比另一个大几百倍。它们也都等于零。

明智的方法可能是避免编写依赖于浮点数是否相等的代码。而是通过某种因素来测试它们是否比较接近。

if ( std::abs(double1-double2) < std::max(std::abs(double1),std::abs(double2)) / 1000.0 )
  std::cout<<"Relatively close";
else
  std::cout<<"Not relatively close";
 类似资料:
  • 问题内容: 我碰到了Java的一个奇怪角落(对我来说似乎很奇怪) o / p:是 o / p:错误 我观察到,如果我们将任意两个值(如我在示例中提到的float和double)与OR 进行比较,例如3.5、234.5、645.0,则输出为即两个值相等,否则输出为相等。 甚至我都试着做方法,但是没有运气。我错过了什么吗? 问题答案: 看一下每位计算机科学家应该了解的浮点数。 将无限多个实数压缩为有限

  • 我有一个使用对象标识的令牌类(如只返回)。我想在中使用它。这意味着我需要实现与引用相等兼容的两个令牌之间的比较。我不关心具体的实现,只要它与一致并履行契约(根据:"注意,如果要正确实现Set接口,由set维护的顺序(无论是否提供显式比较器)必须与equals一致。") 注意:这些令牌是在多个线程上创建的,可以在不同的线程上进行比较。 这样做的最佳方法是什么? 我尝试过的想法: 使用——问题在于,不

  • 问题内容: 我有两个数组列表。 如何在不使用外部库的情况下轻松地将它们 与Java 8及其功能的 相等性进行比较?我正在寻找一种比这种强力代码(未经测试的代码,可能包含错别字等)更好的(更高级别,更短,更有效)的解决方案: 或者,如果没有更好的方法,那也是一个有效的答案。 好处:如果Java 9提供了Java 8可以提供的更好的方法,请随时提一下。 编辑: 在查看评论并查看此问题如何变得中等热点之

  • 本文向大家介绍C++ 模拟实现list(迭代器)实现代码,包括了C++ 模拟实现list(迭代器)实现代码的使用技巧和注意事项,需要的朋友参考一下 C++ 模拟实现list(迭代器) 实现代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 本文向大家介绍C / C ++中float和double的区别,包括了C / C ++中float和double的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在C / C ++中,我们需要float和double数据类型来表示浮点数,即带有小数部分的数字。现在,根据这两种数据类型提供的精度,我们可以区分两者 其中。 简而言之,可以说double的精度是float的2倍,这意味着doub