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;
}
我目前正在学校写 "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;
}