如何比较精度为5位的双精度数
How to compare doubles with 5 digits of precision?
我试图比较两个双精度落在[0.0,1.0]。
我的函数(取自https://stackoverflow.com/a/17341)-
inline bool isEqual(double x, double y)
{
const double epsilon = 0.000001;
return fabs(x - y) < epsilon;
}
使用cerr << isEqual(1.000001, 1.000002) << endl;
cerr << isEqual(1.000010, 1.000020) << endl;
输出为-
0
0
而我期望第一个是true
,第二个是false
。请告诉我哪里我错了,如何解决它?
1.000001
当限于通常的64位IEEE浮点表示时,实际上是1.0000009999999999177333620536956004798412
。同样,1.000002
实际上是1.0000020000000000575113290324225090444087
。这两者的差别比0.000001
更小。
你可以使用一个稍微大一点的比较值来捕获这个:
const double epsilon = 0.0000011;
完全消除浮点数的舍入问题是不可能的。
相关文章:
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 位设置为浮点数或双精度值 c++
- 浮动距离为80位长双精度
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度
- 此代码中的双精度仅为 6 位
- 64 位整数到双精度冲突
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 分配两个双精度值,保证产生相同的位集模式
- 将双精度转换为本地8位
- 如何在不丢失第一位数字的情况下打印出双精度值
- 将两个uint32_t转换为uint64_t,然后根据位模式而不是值变回双精度
- 您能否给我一个 16 位(或更多)十进制数,该十进制数仅在第 15 位正确转换为双精度浮点圆
- 将字符串转换为双精度,而字符串有 N 位小数,C++
- 将双精度转换为精度超过 5 位十进制数字的字符串
- 如何在C++中计算10位小数精度的双变量
- 使用 C++ 中的按位运算隔离双精度的小数部分
- 使用 C++ 的视觉魔术,va_arg不适用于具有双精度的 64 位架构
- 是C++双精度只有 3 位
- 变体浮点数到双精度值转换,四舍五入到小数点后 1 位