C++ 如果一个浮点数在我的机器上是可表示的,那么它的倒数在我的机器上是可表示的吗?

C++ 如果一个浮点数在我的机器上是可表示的,那么它的倒数在我的机器上是可表示的吗?,c++,c,floating-point,C++,C,Floating Point,给定一个存储正值的double类型的初始化对象x,我想找到最小的doublev,比如0,当然,正无穷大的倒数小于任何正有理数。除此之外,由于非规范数,即使是最大的有限浮点数,其乘法逆也远高于等效宽度的最小可表示浮点数。我假设double是IEEE 754 binary64 如果一个浮点数在我的机器上是可表示的,那么它的倒数在我的机器上是可表示的吗 不一定,原因有二: 反向可能不是浮点数 例如,虽然3是浮点数,但1/3不是 相反的可能会溢出 例如,2的倒数−1074是21074,它不仅比所有有限

给定一个存储正值的
double
类型的初始化对象
x
,我想找到最小的
double
v
,比如
0,当然,正无穷大的倒数小于任何正有理数。除此之外,由于非规范数,即使是最大的有限浮点数,其乘法逆也远高于等效宽度的最小可表示浮点数。

我假设
double
是IEEE 754 binary64

如果一个浮点数在我的机器上是可表示的,那么它的倒数在我的机器上是可表示的吗

不一定,原因有二:

  • 反向可能不是浮点数

    例如,虽然3是浮点数,但1/3不是

  • 相反的可能会溢出

    例如,2的倒数−1074是21074,它不仅比所有有限浮点数都大,而且比最大的有限浮点数1的一半还要大。ffffffffffffp+1023=21024− 2971,如果指数的范围更大的话,下一个指数是21024。 2的倒数−1074四舍五入到无穷大

  • 给定一个存储正值的
    double
    类型的初始化对象
    x
    ,我想找到最小的
    double
    v
    ,例如
    0
    如果一个浮点数在我的机器上是可表示的,那么它的倒数在我的机器上是可表示的吗


    不存在。
    1.0/DBL_MINNo。浮点数在
    1.0
    左右平衡,以最小化计算逆的影响,但这种平衡并不精确,而是指数的中间点(指数的值
    0x3fff…
    给出了高于和低于
    1.0
    的两个相同的幂次数。但是指数值
    0x4fff…
    保留为无穷大,然后是NaN,而值
    0x0000…
    保留为非规范化(也称为亚规范化)这些值不规范化(有些体系结构甚至没有实现它们),但在那些实现的体系结构中,它们将尾数宽度的位数添加为2的幂,再加上(但精度较低)规范化的位数,范围为 负指数。这意味着你有一组o数,非常接近于零,当你计算它们的倒数时,你总是得到无穷大

    对于双打,你有52个以上的2次方,或者大约15个以上的10次方。对于
    float
    s,这是大约7个以上的10次方


    但这也意味着,如果你计算一个大数的倒数,你总是会得到一个不同于零的数。

    如果允许非规范化浮点,分数可能会比最大浮点的倒数小得多。在与IEEE-754浮点标准兼容的平台上,
    DBL\u EPSILON
    很可能是
    0x1.0p-52
    。因此,只有正的
    x==x1<0x1.0p+52
    DBL_EPSILON
    保证小于1/x。
    0.0
    是可表示的,但我打赌
    1/0.0
    不是,除非你数NaN。@tadman这就是为什么我指定x为正数。没有小于
    v=0的值符合e> 0我还没有读你的答案,但关于你的最后一个问题,我想选择右开区间的最大可表示数,其中区间的大小是一个逆乘法,所以我取边界并对ε进行减分,确保ε不大于区间的大小;否则我将选择左开区间区间的边界。@Peregring lk subtraction
    DBL_EPSILON
    几乎从来都不是一件合适的事情,这表明您可能不清楚浮点运算是如何工作的。如果您试图使下一个浮点数接近零,您可以使用
    nextafter
    ,但很少有数字
    t
    f对于下一个
    t(0)
    t-DBL\u EPSILON
    一致。你到底想在这里做什么?你想实现区间算法吗?这是一个最大化问题,解决方案与区间以及其他限制条件有关。如果我选择了不在特定区间内的内容,那么我返回的是一个不可行或非最优的解决方案。