ULP计算浮点数

时间:2016-06-23 13:51:12

标签: java math floating-point precision

我目前正在撰写一种新语言"在学校,我必须实施一门数学课。

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

我找到了许多有趣的资料,但我仍然无法计算浮标的ulp ..

AFAIK,如果

normalized x

然后

ulp equation

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

感谢您的帮助,

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

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

建议你使用一个能够正确完成这项工作的库。

我在(而非间接)的注释中通知的另一个选项意味着将float位转换为int。我会直接写一段代码。我不熟悉Java(由于缺少包/类说明符,代码可能无法立即生效(floatToIntBits以及intToFloatBits是类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;
}