我目前正在学校里写“新语言”,我必须开设一门数学课。

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

我发现了许多有趣的资源,但仍然无法计算出浮点的ulp。

AFAIK,如果

java - ULP计算浮点-LMLPHP

然后

java - ULP计算浮点-LMLPHP

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

感谢您的帮助,

最好的祝福,

最佳答案

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

建议您使用一个可以为您正确完成此工作的库。

我在(而不是间接地)的注释中得到通知的另一种选择是将浮点数转换为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;
}

10-05 18:06
查看更多