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

use*_*466 2 c# floating-point precision

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

例如:

在范围16777217f20000000f答案是2,因为值有效四舍五入到最接近的两位.

将其推广到任意范围让我摸不着头脑 - 任何建议?

干杯,

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

Eri*_*hil 6

这是在C.它需要一些IEEE 754行为,用于舍入等.对于IEEE 754的64位二进制(double),SmallestPositive是2 -1074,大约4.9406564584124654417656879286822137236505980261e-324,和DBL_EPSILON是2 -52,2.220446049250313080847263336181640625e-16.对于32位二进制(float),改DBLFLTdoublefloat任何地方出现,他们(和fabsfabsffmaxfmaxf,尽管它应该没有这些改变工作).然后SmallestPositive是2 -149,大约1.401298464324817070923729583289916131280261941876515771757068283889791e-45,和FLT_EPSILON是2 -23,1.1920928955078125e-07.

对于两个值之间的间隔,最大步长当然是端点处具有较大幅度的步长.(如果该端点是完全的二的幂,从该点步长到下一个未出现在所述间隔本身,所以这将是一种特殊情况.)

#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));
}
Run Code Online (Sandbox Code Playgroud)