一系列花车中最大的不准确度是多少?

时间:2013-03-20 22:42:55

标签: c# floating-point precision

给定两个浮点值(fLowfHigh),您如何计算两个连续值之间的最大或最大步幅/差距?

例如:

16777217f20000000f的范围内,答案为2,因为值实际上四舍五入到最接近的两个。

将其概括为任意范围让我摸不着头脑 - 任何建议?

欢呼声,

这应该是语言中立的,但我正在使用C#(我认为这符合IEEE-754)。

2 个答案:

答案 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}}和fabsffmax,虽然它可以在没有这些更改的情况下工作)。然后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|规范化这个词在这里非常重要,我甚至不会考虑去标准化数字的情况,因为这是事情变得非常讨厌的地方......

也就是说,在您的特定情况下,您建议的时间间隔内的最大间距hh = 2*s*max(|fLow|, |fHigh|)给出。