gpt4 book ai didi

c++ - 使用 epsilon 将 double 与零进行比较

转载 作者:IT老高 更新时间:2023-10-28 11:27:07 26 4
gpt4 key购买 nike

今天,我翻阅了一些 C++ 代码(由其他人编写),发现了这个部分:

double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}

我正在尝试弄清楚这是否有意义。

epsilon() 的文档说:

The function returns the difference between 1 and the smallest value greater than 1 that is representable [by a double].

这是否也适用于 0,即 epsilon() 是大于 0 的最小值?或者 00 + epsilon 之间是否有可以用 double 表示的数字?

如果不是,那么比较不等于 someValue == 0.0

最佳答案

假设 64 位 IEEE double,则有 52 位尾数和 11 位指数。让我们分解一下:

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0 = 1

大于1的最小可表示数:

1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1 + 2^-52

因此:

epsilon = (1 + 2^-52) - 1 = 2^-52

0 和 epsilon 之间有数字吗?很多...例如最小正可表示(正常)数是:

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^-1022 = 2^-1022

实际上在 0 和 epsilon 之间有 (1022 - 52 + 1)×2^52 = 4372995238176751616 个数,占所有可表示正数的 47%...

关于c++ - 使用 epsilon 将 double 与零进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13698927/

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