IEEE 754浮点数,最大数量< 1?

时间:2015-09-01 16:29:44

标签: c++

当使用IEEE 754浮点表示(c ++中的double类型)时,非常接近(可表示)整数的数字将四舍五入到它们最接近的整数并准确表示。这是真的吗? 在舍入之前,数字到底是多么接近最接近的可表示整数? 这个距离是否恒定?
例如,假设1可以准确表示,那么最小double小于1是什么?

5 个答案:

答案 0 :(得分:6)

  

使用IEEE 754浮点表示(double类型时   c ++),非常接近(可表示)整数的数字是   四舍五入到最接近的整数并完全表示。

这取决于数字是否更接近整数而不是其他可表示的值。 0.99999999999999994 is not equal to 1, but 0.99999999999999995 is.

  

这个距离是否恒定?

不,它在更大的范围内变得更小 - 特别是在表示中具有更大的指数。较大的指数意味着尾数覆盖较大的间隔,这反过来意味着整体精度较低。

  

例如,什么是小于1的最大双倍?

std::nexttoward(1.0, 0.0)。例如。 0.999999999999999889 on Coliru

答案 1 :(得分:2)

你会发现更多关于1.0的相反方向的明确陈述 这里记录了1.0和下一个更大数字之间的差异:

std::numeric_limits<double>::epsilon()

浮点的工作方式,下一个较小的数字应该与下一个较大的数字正好相差一半。

答案 2 :(得分:2)

第一个低于1的IEEE双数可以明确地写为0.99999999999999989,但正好是0.99999999999999988897769753748434595763683319091796875。

距离常数,它取决于数字的指数(以及数量)。最终差距变得大于1,这意味着偶数(不是奇数 - 奇数整数是第一个得到舍入的整数)整数将稍微变圆(或者最终变得很多)。

答案 3 :(得分:0)

增加IEEE浮点数的二进制表示可以看作是递增的整数表示:

示例Hack(英特尔):

#include <cstdint>
#include <iostream>
#include <limits>

int main() {
    double one = 1;
    std::uint64_t one_representation = *reinterpret_cast<std::uint64_t*>(&one);
    std::uint64_t lesser_representation = one_representation - 1;
    std::cout.precision(std::numeric_limits<double>::digits10 + 1);
    std::cout << std::hex;
    std::cout << *reinterpret_cast<double*>(&lesser_representation)
              << " [" << lesser_representation
              << "] < " << *reinterpret_cast<double*>(&one_representation)
              << " [" << one_representation
              << "]\n";
}

输出:

0.9999999999999999 [3fefffffffffffff] < 1 [3ff0000000000000]

当将整数表示推进到其极限时,如果指数位发生变化,则连续浮点数的差异会增加。

另请参阅:http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

答案 4 :(得分:-2)

  

当使用IEEE 754浮点表示(c ++中的double类型)时,非常接近精确整数的数字将四舍五入为最接近的整数并准确表示。这是真的吗?

这是假的。

  

在舍入之前,数字到最近的int到底有多接近?

当您进行二进制到字符串转换时,浮点数将四舍五入为当前精度(对于printf系列函数,默认精度为6)使用当前舍入模式。