我目前正在撰写一种新语言"在学校,我必须实施一门数学课。
其中一个规范是实现ulp方法,如Java中的Math.ulp()。我们正在研究浮点类型。
我找到了许多有趣的资料,但我仍然无法计算浮标的ulp ..
AFAIK,如果
然后
但是,如何在没有任何lib的情况下获得浮点数的规范化形式? 以及如何获得参数e& n + 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;
}