给定两个浮点值(fLow
和fHigh
),您如何计算两个连续值之间的最大或最大步幅/差距?
例如:
在16777217f
到20000000f
的范围内,答案为2
,因为值实际上四舍五入到最接近的两个。
将其概括为任意范围让我摸不着头脑 - 任何建议?
欢呼声,
这应该是语言中立的,但我正在使用C#(我认为这符合IEEE-754)。
答案 0 :(得分:6)
这是在C.它需要一些IEEE 754行为,用于舍入等。对于IEEE 754 64位二进制(double
),SmallestPositive
为2 -1074 ,大约为4.9406564584124654417656879286822137236505980261e-324,DBL_EPSILON为2 -52 ,2.220446049250313080847263336181640625e-16。对于32位二进制(float
),将DBL
更改为FLT
,将double
更改为float
,无论它们出现在何处(fabs
到{{ 1}}和fabsf
到fmax
,虽然它可以在没有这些更改的情况下工作)。然后fmaxf
是2 -149 ,大约1.401298464324817070923729583289916131280261941876515771757068283889791e-45,FLT_EPSILON是2 -23 ,1.1920928955078125e-07。
对于两个值之间的间隔,最大步长当然是端点处具有较大幅度的步长。 (如果该端点恰好是2的幂,则从该点到下一个的步长不会出现在区间本身中,因此这将是一种特殊情况。)
SmallestPositive
答案 1 :(得分:1)
嗯,正如名称所示,机器精度通常取决于机器甚至编译器。因此,要确定您通常必须编写一个实际测试正在进行的程序。
但是,我怀疑你真的在寻找一些方便的公式,你可以用它来近似给定间隔内的最大距离。关于machine epsilon的维基百科文章给出了关于这个主题的非常好的概述,我在下面主要引用了这个来源。
让s
成为浮点表示的机器epsilon(即,在标准浮点数的情况下大约为2 ^( - 24)),然后归一化之间的最大间距数字x
及其邻居为2*s*|x|
。 规范化这个词在这里非常重要,我甚至不会考虑去标准化数字的情况,因为这是事情变得非常讨厌的地方......
也就是说,在您的特定情况下,您建议的时间间隔内的最大间距h
由h = 2*s*max(|fLow|, |fHigh|)
给出。