甲float(又名单个)值是一个4字节的值,并且应该代表任何实值的数.由于它的格式化方式和有限的字节数,它可以表示最小值和最大值,并且它具有有限的精度,具体取决于它自己的值.
我想知道是否有办法在浮点数的有限精度下获得高于或低于某个参考值的最接近的可能值.对于整数,这是微不足道的:只需添加或减去1.但是使用a float,您不能简单地添加或减去最小浮点值并期望它与原始值不同.即
float FindNearestSmaller (const float a)
{
return a - FLT_MIN; /* This doesn't necessarily work */
}
Run Code Online (Sandbox Code Playgroud)
事实上,上述几乎永远不会奏效.在上面的例子中,返回通常仍然相等a,因为FLT_MIN它远远超出了精度a.您可以轻松地自己尝试:它适用于例如0.0f或非常少量的订单FLT_MIN,但不适用于0到100之间的任何订单.
那么在a给定浮点精度的情况下,如何获得最接近但小于或大于的值?
注意:虽然我主要对C/C++答案感兴趣,但我认为答案适用于大多数编程语言.
C++ 11 std :: uniform_real_distribution(-1,1)给出了[-1,1]范围内的数字.
你如何在[-1,1]范围内获得统一的实际分布?
实际上它可能没关系,但从逻辑上讲,我正试图在包含范围内选择一个值.
我有问题确定eps给定的双变量的最小值,v这样
v+eps != v
Run Code Online (Sandbox Code Playgroud)
请注意,这不是典型的问题表任务,因为它eps取决于任意数字v.
这不应该通过在for循环中寻找这个值来完成.有没有快速的方法来做到这一点,例如通过位移?独立于编译器,优化标志,平台......
谢谢你的回答
这种特殊的nextafter(和nexttoward)函数接口背后的原因究竟是什么?我们指定的方向通过指定我们想要移动的价值走向。
乍一看,这个想法背后似乎隐藏着一些不明显的东西。在我(天真)看来,此类函数的首选将类似于一对单参数函数nextafter(a)/ nextbefore(a)。下一个选择将是一个双参数函数nextafter(a, dir),其中dir明确指定方向(-1和+1,一些标准枚举等)。
而是我们必须指定一个值,我们希望移动走向。因此有许多问题
(一个模糊的)。可能有一些聪明的想法或惯用的模式非常有价值,以至于影响了这些标准功能中的接口选择。在那儿?
如果决定盲目地使用-DBL_MAX和+DBL_MAX作为nextafter分别指定负方向和正方向的第二个参数会怎样。这样做有什么陷阱吗?
(2 的改进)。如果我知道肯定b是[轻微]大于a,没有任何理由,更喜欢nextafter(a, b)了nextafter(a, DBL_MAX)?例如,nextafter(a, b)版本是否有更好的性能?
是nextafter通常一个沉重的操作?我知道它是依赖于实现的。但是,再次假设一个基于 IEEE 754 表示的实现,找到相邻的浮点值是否相当“困难”?