我正在做一些舍入计算并发生了一个问题.对于给定的浮点类型,如何表示小于1的最大数量?
也就是说,我怎么写/代表值x
,使得x < 1, x + y >= 1
任何y > 0
.
在级分,这将是x = (q-1)/q
其中q
是精确的类型.例如,如果您以1/999
增量计数,那么x = 998/999
.
对于给定的类型(float,double,long double),如何x
在代码中表达值?
我也想知道这个值是否真的存在于所有的值中y
.也就是说,随着y's
指数变小,也许这种关系不再成立.因此,对某些范围限制的答案y
也是可以接受的.(x
我想要的价值仍然存在,这种关系可能无法正确表达.)
qrd*_*rdl 12
C99定义了nextafter()
功能.像它一样使用它
#include <math.h>
double under_one = nextafter(1, 0);
Run Code Online (Sandbox Code Playgroud)
Altouht 其他人认为更大的值小于1
is 1-FLT_EPSILON
,在浮点数中它不能满足x < 1, x + y >= 1
any 的y > 0
条件,除非您使用四舍五入。
原因是 1 和它之前的距离(FLT_EPSILON
约 1.2E-7)远大于可表示的最小正数FLT_MIN
,即约 1.2E-38。因此,存在一类数字(FLT_MIN ... FLT_EPSILON/2
四舍五入到最接近的数字时,这是大多数系统的默认设置),其中(1-FLT_EPSILON)+y == (1-FLT_EPSILON) < 1
.