Compare double to zero using epsilon(使用 epsilon 将双精度数与零进行比较)
问题描述
今天,我翻阅了一些 C++ 代码(由其他人编写),发现了这个部分:
Today, I was looking through some C++ code (written by somebody else) and found this section:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
我正在尝试弄清楚这是否有意义.
I'm trying to figure out whether this even makes sense.
epsilon()
的文档说:
该函数返回 1 和大于 1 的最小值之间的差值,该值可以 [用双精度数] 表示.
The function returns the difference between 1 and the smallest value greater than 1 that is representable [by a double].
这是否也适用于 0,即 epsilon()
是大于 0 的最小值?或者 0
和 0 + epsilon
之间是否有可以用 double
表示的数字?
Does this apply to 0 as well, i.e. epsilon()
is the smallest value greater than 0? Or are there numbers between 0
and 0 + epsilon
that can be represented by a double
?
如果不是,那么比较不等于 someValue == 0.0
?
If not, then isn't the comparison equivalent to someValue == 0.0
?
推荐答案
假设 64 位 IEEE 双精度,有 52 位尾数和 11 位指数.让我们分解一下:
Assuming 64-bit IEEE double, there is a 52-bit mantissa and 11-bit exponent. Let's break it to bits:
1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0 = 1
大于1的最小可表示数:
The smallest representable number greater than 1:
1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1 + 2^-52
因此:
epsilon = (1 + 2^-52) - 1 = 2^-52
0 和 epsilon 之间有数字吗?很多...例如最小正可表示(正常)数是:
Are there any numbers between 0 and epsilon? Plenty... E.g. the minimal positive representable (normal) number is:
1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^-1022 = 2^-1022
实际上在 0 和 epsilon 之间有 (1022 - 52 + 1)×2^52 = 4372995238176751616
个数,占所有可表示正数的 47%...
In fact there are (1022 - 52 + 1)×2^52 = 4372995238176751616
numbers between 0 and epsilon, which is 47% of all the positive representable numbers...
这篇关于使用 epsilon 将双精度数与零进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 epsilon 将双精度数与零进行比较


基础教程推荐
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 常量变量在标题中不起作用 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09