C++ 浮点数比较代码

2023-04-22,

#include <algorithm>
#include <cmath>
#include <iostream> // 如果 a 和 b 之间的差异在 a 和 b 中较大者的 epsilon 百分比以内,则返回 true
bool approximatelyEqualRel(double a, double b, double relEpsilon)
{
return (std::abs(a - b) <= (std::max(std::abs(a), std::abs(b)) * relEpsilon));
} bool approximatelyEqualAbsRel(double a, double b, double absEpsilon, double relEpsilon)
{
// 检查数字是否真的很接近——比较接近零的数字时需要。
double diff{ std::abs(a - b) };
if (diff <= absEpsilon)
return true; // 否则退回到 Knuth 的算法
return (diff <= (std::max(std::abs(a), std::abs(b)) * relEpsilon));
} int main()
{
// a 非常接近 1.0,但有舍入误差
double a{ 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 }; std::cout << approximatelyEqualRel(a, 1.0, 1e-8) << '\n'; // 将“几乎 1.0”与 1.0 进行比较
std::cout << approximatelyEqualRel(a-1.0, 0.0, 1e-8) << '\n'; // 将“几乎 0.0”与 0.0 进行比较 std::cout << approximatelyEqualAbsRel(a, 1.0, 1e-12, 1e-8) << '\n'; // 将“几乎 1.0”与 1.0 进行比较
std::cout << approximatelyEqualAbsRel(a-1.0, 0.0, 1e-12, 1e-8) << '\n'; // 将“几乎 0.0”与 0.0 进行比较

C++ 浮点数比较代码的相关教程结束。

《C++ 浮点数比较代码.doc》

下载本文的Word格式文档,以方便收藏与打印。