gpt4 book ai didi

algorithm - IEEE754 单精度 - 表示数字一半的通用算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:19 38 4
gpt4 key购买 nike

假设 N 是根据 IEEE754 单精度标准表示的任意数字。我想在 IEEE754 中再次找到 N/2 的最精确可能表示。

我想找到一个通用算法(用文字描述,我只想考虑必要的步骤和情况)来获得表示。

我的做法是:

假设数字表示:b0_b1_b2_b3...b_34

  1. 隔离确定数字符号 (-/+) 的第一位。
  2. 根据无符号表示 b_1...b_11 计算幂 (p) 的表示。
  3. 如果 power = 128 我们有一个特例。如果尾数的所有位都等于 0,则根据 b_0,我们有负无穷大或正无穷大。我们不改变任何东西。如果尾数至少有一位等于 1,则我们有 NaN 值。同样,我们什么也没改变。
  4. 如果 e 在里面]-126, 127[那么我们有一个归一化的尾数m。新的幂 p 可以计算为p' = p - 1并且属于区间]-127, 126]。然后我们计算m/2`,我们从右边开始表示它并丢失不能包含在尾数的 23 位中的任何位。
  5. 如果 e = -126,那么在计算这个数字的一​​半时,我们传入一个非规范化的尾数。我们表示 p = 127,计算尾数的一半并从右边开始再次表示它,丢失任何不能包含的信息。
  6. 最后如果 e = -127 我们有一个非规范化的尾数。只要 m/2 可以用尾数中可用的位数表示而不丢失信息,我们就表示它并保持 p = -127。在任何其他情况下,我们根据 b_0
  7. 将数字表示为正数或负数 0

我错过了任何步骤、可以进行的任何改进(我相信有)或任何看起来完全错误的事情?

最佳答案

我用 Java 实现了除以二的算法,并针对所有 32 位输入验证了它。我试图遵循您的伪代码,但在三个地方出现了分歧。首先,无穷大/NaN 指数是 128。其次,在情况 4(正常 -> 正常)中,不需要对分数进行运算。第三,你没有描述当你对分数进行操作时,半圆是如何工作的。否则为 LGTM。

public final class FloatDivision {
public static float divideFloatByTwo(float value) {
int bits = Float.floatToIntBits(value);
int sign = bits >>> 31;
int biased_exponent = (bits >>> 23) & 0xff;
int exponent = biased_exponent - 127;
int fraction = bits & 0x7fffff;
if (exponent == 128) {
// value is NaN or infinity
} else if (exponent == -126) {
// value is normal, but result is subnormal
biased_exponent = 0;
fraction = divideNonNegativeIntByTwo(0x800000 | fraction);
} else if (exponent == -127) {
// value is subnormal or zero
fraction = divideNonNegativeIntByTwo(fraction);
} else {
// value and result are normal
biased_exponent--;
}
return Float.intBitsToFloat((sign << 31) | (biased_exponent << 23) | fraction);
}

private static int divideNonNegativeIntByTwo(int value) {
// round half to even
return (value >>> 1) + ((value >>> 1) & value & 1);
}

public static void main(String[] args) {
int bits = Integer.MIN_VALUE;
do {
if (bits % 0x800000 == 0) {
System.out.println(bits);
}
float value = Float.intBitsToFloat(bits);
if (Float.floatToIntBits(divideFloatByTwo(value)) != Float.floatToIntBits(value / 2)) {
System.err.println(bits);
break;
}
} while (++bits != Integer.MIN_VALUE);
}
}

关于algorithm - IEEE754 单精度 - 表示数字一半的通用算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50140373/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com