Yel*_*low 16 c floating-point floating-accuracy
甲float(又名单个)值是一个4字节的值,并且应该代表任何实值的数.由于它的格式化方式和有限的字节数,它可以表示最小值和最大值,并且它具有有限的精度,具体取决于它自己的值.
我想知道是否有办法在浮点数的有限精度下获得高于或低于某个参考值的最接近的可能值.对于整数,这是微不足道的:只需添加或减去1.但是使用a float,您不能简单地添加或减去最小浮点值并期望它与原始值不同.即
float FindNearestSmaller (const float a)
{
    return a - FLT_MIN; /* This doesn't necessarily work */
}
事实上,上述几乎永远不会奏效.在上面的例子中,返回通常仍然相等a,因为FLT_MIN它远远超出了精度a.您可以轻松地自己尝试:它适用于例如0.0f或非常少量的订单FLT_MIN,但不适用于0到100之间的任何订单.
那么在a给定浮点精度的情况下,如何获得最接近但小于或大于的值?
注意:虽然我主要对C/C++答案感兴趣,但我认为答案适用于大多数编程语言.
Pas*_*uoq 14
查找浮点值邻居的标准方法是nextafterfor double和nextafterffor 的函数float.第二个论点给出了方向.请记住,无穷大是IEEE 754浮点中的合法值,因此您可以很好地调用nextafter(x, +1.0/0.0)以获取上面的值x,这甚至可以用于DBL_MAX(如果您编写nextafter(x, DBL_MAX),它将DBL_MAX在申请时返回x == DBL_MAX).
有时有用的两种非标准方式是:
访问float/ 的表示形式double作为相同大小的无符号整数,并递增或递减此整数.浮点格式经过精心设计,以便对于正浮点数和负浮点数,表示的位(看作整数)与所表示的浮点单调演变.
将舍入模式更改为向上,并添加最小的正浮点数.最小的正浮点数也是两个浮点数之间可以存在的最小增量,因此永远不会跳过任何浮点数.最小的正浮点数是FLT_MIN * FLT_EPSILON.
为了完整起见,我将补充一点,即使不将舍入模式从"最接近"默认值更改,乘以浮点数(1.0f + FLT_EPSILON)也会产生一个数字,该数字可以是远离零的直接邻居,也可以是之后的邻居.它可能是最便宜的,如果你已经知道你希望增加/减少浮动的符号,你不介意它有时不产生直接邻居.函数nextafter和nextafterf指定的方式是x86上的正确实现必须测试许多特殊值和FPU状态,因此它的功能相当昂贵.
走向零,乘以1.0f - FLT_EPSILON.
0.0f显然,这通常不适用于较小的非规范化数字.
乘以1.0f + FLT_EPSILON2 ULPS的值恰好低于2的幂,特别是在[0.75*2 p ... 2 p)的区间内.如果您不介意进行乘法和加法,则x + (x * (FLT_EPSILON * 0.74))应该适用于所有正常数字(但仍然不是零,也不是所有小的非正规数字).
| 归档时间: | 
 | 
| 查看次数: | 1769 次 | 
| 最近记录: |