【发布时间】:2016-12-12 14:47:01
【问题描述】:
有没有办法以编程方式获取最接近 1.0 但实际上不是 1.0 的双精度数?
实现此目的的一种巧妙方法是将双精度数 memcpy 为相同大小的整数,然后减一。 IEEE754 浮点格式的工作方式,最终将指数减一,同时将小数部分从全零 (1.000000000000) 更改为全一 (1.111111111111)。但是,有些机器将整数存储在小端,而浮点存储在大端,所以这并不总是有效。
【问题讨论】:
-
您不能假设 +1 与 -1 的距离(从 1.0 开始)相同。以 10 为基数和以 2 为基数的浮点表示的交错意味着间隙是不均匀的。
-
@Richard:你是对的。减去一个 ULP 不太可能得到呃,“nextbefore”值,因为我猜指数也必须调整。
nextafter()是实现他想要的唯一正确方法。 -
仅供参考,我读过这个博客(不是我的):exploringbinary.com/…
-
@RudyVelthuis:它适用于每一种 IEEE754 二进制浮点格式。
-
好的,然后告诉我:什么“适用于每种 IEEE754 浮点格式”?如果您减少有效数字,您将获得“firstbefore()”值,这根本是不正确的,尤其是对于 1.0,它的有效数字是 2 的幂。这意味着
1.0000...二进制递减到0.111111....并且要对其进行规范化,您必须将其向左移动:1.11111...这需要您递减指数。然后你距离 1.0 2 ulp。所以不,从积分值中减去 1 并不能得到这里所要求的内容。
标签: c++ floating-point floating-accuracy