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 subtractionDBL_EPSILON
几乎从来都不是一件合适的事情,这表明您可能不清楚浮点运算是如何工作的。如果您试图使下一个浮点数接近零,您可以使用nextafter
,但很少有数字t
f对于下一个t(0)
与t-DBL\u EPSILON
一致。你到底想在这里做什么?你想实现区间算法吗?这是一个最大化问题,解决方案与区间以及其他限制条件有关。如果我选择了不在特定区间内的内容,那么我返回的是一个不可行或非最优的解决方案。