C# 在一系列浮动中,最大的误差是什么?

C# 在一系列浮动中,最大的误差是什么?,c#,floating-point,precision,C#,Floating Point,Precision,给定两个浮点值(fLow和fHigh),如何计算两个连续值之间的最大或最大跨距/间隙 例如: 在16777217f到200000f的范围内,答案将是2,因为值有效地四舍五入到最接近的两个 把它推广到任意范围让我挠头——有什么建议吗 干杯 这应该是语言中立的,但我使用的是C#(我认为这符合IEEE-754)。这是C语言。它需要一些IEEE 754行为,用于舍入等。对于IEEE 754 64位二进制(double),SmallestPositive为2-1074,约为4.94065645841246

给定两个浮点值(
fLow
fHigh
),如何计算两个连续值之间的最大或最大跨距/间隙

例如:

16777217f
200000f
的范围内,答案将是
2
,因为值有效地四舍五入到最接近的两个

把它推广到任意范围让我挠头——有什么建议吗

干杯


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

这是C语言。它需要一些IEEE 754行为,用于舍入等。对于IEEE 754 64位二进制(
double
),
SmallestPositive
为2-1074,约为4.940656458412465441765687928682213723650590261E-324,DBL_ε为2-52,2.220446049250313080847263336181640625e-16。对于32位二进制(
float
),将
DBL
更改为
FLT
,将
double
更改为
float
(将
fabs
更改为
fabsf
,将
fmax
更改为
fmaxf
,尽管它应该在没有这些更改的情况下工作)。然后
SmallestPositive
为2-149,约为1.401298464324817092372958328991613128026194187651577175682838897991e-45,FLT_ε为2-23,1.1920928955078125e-07

对于两个值之间的间隔,最大步长当然是端点处具有较大幅值的步长。(如果该端点正好是2的幂,则从该点到下一点的步长不会出现在间隔本身中,因此这是一种特殊情况。)

#包括
#包括
/*返回q的ULP。
这是受到Siegfried M.Rump、Takeshi Ogita和
Shin'ichi Oishi,“精确浮点求和”,\u技术报告
05.12,汉堡信息与传播科学学院
科技大学,2005年11月13日。
*/
双ULP(双q)
{
//SmallestPosition是最小的正浮点数。
静态常数double SmallestPositive=DBL_EPSILON*DBL_MIN;
/*标度为.75 ULP,因此将其乘以[1,2]中的任何有效位都会产生收益
在[0.75 ULP,1.5 ULP]中的某物(即使是四舍五入)。
*/
静态常数双刻度=0.75*DBL_ε;
q=fabs(q);
返回fmax(最小正,q-(q-q*刻度));
}

正如名称所示,机器的准确性实际上取决于机器,甚至取决于编译器。因此,要真正确定这一点,您通常必须编写一个程序来实际测试正在发生的事情

然而,我怀疑你真的在寻找一些方便的公式,你可以使用这些公式来近似给定间隔内的最大距离

s
为浮点表示的机器ε(即,对于标准浮点,约为2^(-24))这里的最大间距在<强>标准> <编号>代码> x < /代码>和它的邻居是“代码> 2 *s*x x < /COD>。这里,归一化的单词是非常关键的,我甚至不会试图考虑去归一化的数字的情况,因为这是事情变得非常糟糕……/P>
也就是说,在您的特定情况下,您建议的间隔中的最大间隔
h
h=2*s*max(| fLow |,| fHigh |)给出

你是如何得出这个特定范围的
2
的?难道不是只有2^ExpMax吗?只要你不必处理低于正常值的问题,Cole是对的。@user2152466,你对浮点数了解多少,你对什么范围感兴趣?你需要为绝对适合的任何东西做到这一点吗进入浮动?我知道指数、尾数、次正常值的定义,但没有很好的工作直觉-我怀疑在实践中没有次正常值我也能逃脱。所以我猜要重新解释一下,通过长时间、小范围的操作来获得指数?谢谢-没有意识到这个概念是如此主流-谷歌ULP也是如此让我看到了-看起来没有内置的C#,但我想现在已经足够了,非常感谢
#include <float.h>
#include <math.h>

/*  Return the ULP of q.

    This was inspired by Algorithm 3.5 in Siegfried M. Rump, Takeshi Ogita, and
    Shin'ichi Oishi, "Accurate Floating-Point Summation", _Technical Report
    05.12_, Faculty for Information and Communication Sciences, Hamburg
    University of Technology, November 13, 2005.
*/
double ULP(double q)
{
    // SmallestPositive is the smallest positive floating-point number.
    static const double SmallestPositive = DBL_EPSILON * DBL_MIN;

    /*  Scale is .75 ULP, so multiplying it by any significand in [1, 2) yields
        something in [.75 ULP, 1.5 ULP) (even with rounding).
    */
    static const double Scale = 0.75 * DBL_EPSILON;

    q = fabs(q);

    return fmax(SmallestPositive, q - (q - q * Scale));
}