ULP计算浮点数

ULP calculation floating-point

我目前正在学校写 "new language",我必须实施数学 class。

规范之一是实现 ulp 方法,如 Java 中的 Math.ulp()。我们正在研究浮点类型。

我发现了许多有趣的来源,但我仍然无法计算浮点数的 ulp..

据我所知,如果

然后

但是,如何在没有任何 lib 的情况下获得 float 的规范化形式? 以及如何获取参数 e & n+1 ?

感谢您的帮助,

此致,

我不确定 Java 是否有可能使用别名来获取浮点数的位模式(有足够接近的替代方案,如答案的第二部分所示),但是如果它确实如此,那么 e 是第 23 位到第 30 位(31 是符号)减去某个常数(如 the wikipedia description of the format,除非数字是次正规的,否则它是 127)而 n 是固定的(在这种情况下它是 23 位,或 24如果它包含隐含的 1)

建议您使用可以正确完成这项工作的库。

我在(相当间接地)的评论中被告知的另一个选项意味着将浮点位转换为 int。我会直接写一段代码。我并不完全精通 Java(由于缺少 package/class 说明符,代码可能无法立即运行(floatToIntBits 和 intToFloatBits 是 class java.lang.Float 的静态方法) . 这与上面的建议不同,因为它有点不正统,但它比你在问题本身中建议的代码有更好的性能。

float ulp(float x) {
    int repr;
    float next;
    if (Float.isNaN(x)) return Float.NaN; //special handling, to be safe
    repr = Float.floatToIntBits(x);
    x++; //will work correctly independently of sign
    next = Float.intBitsToFloat(repr)
    return next-x;
}