- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设 N 是根据 IEEE754 单精度标准表示的任意数字。我想在 IEEE754 中再次找到 N/2 的最精确可能表示。
我想找到一个通用算法(用文字描述,我只想考虑必要的步骤和情况)来获得表示。
我的做法是:
假设数字表示:b0_b1_b2_b3...b_34
。
b_1...b_11
计算幂 (p) 的表示。power = 128
我们有一个特例。如果尾数的所有位都等于 0,则根据 b_0
,我们有负无穷大或正无穷大。我们不改变任何东西。如果尾数至少有一位等于 1,则我们有 NaN
值。同样,我们什么也没改变。e 在里面
]-126, 127[那么我们有一个归一化的尾数
m。新的幂 p 可以计算为
p' = p - 1并且属于区间
]-127, 126]。然后我们计算
m/2`,我们从右边开始表示它并丢失不能包含在尾数的 23 位中的任何位。e = -126
,那么在计算这个数字的一半时,我们传入一个非规范化的尾数。我们表示 p = 127
,计算尾数的一半并从右边开始再次表示它,丢失任何不能包含的信息。e = -127
我们有一个非规范化的尾数。只要 m/2
可以用尾数中可用的位数表示而不丢失信息,我们就表示它并保持 p = -127
。在任何其他情况下,我们根据 b_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/
除非 IEEE 754 是 NaN、+-0.0 或 +-Infinity,否则自除是否保证结果正好是 1.0? 同样,减去本身是否保证总是导致 +-0.0? 最佳答案 IEEE 754-2008 4.
我已经阅读了一些文本和线程,展示了如何从十进制转换为 IEEE 754,但我仍然对如何在不扩展小数(以科学计数法表示)的情况下转换数字感到困惑 我特别使用的数字是9.07 * 10^23,但任何数字都
为什么 float 中的指数要置换 127? 那么,真正的问题是:与 2 的补码相比,这种表示法有什么优势? 最佳答案 由于存储的指数是无符号的,因此可以使用整数指令来比较浮点值。为了比较(不是补码)
我一直在使用 Mendeley 的 Microsoft Word 插件轻松引用我的 Mendeley 桌面图书馆中的论文。 但是,我注意到 IEEE 格式的引用书目/引文在引用 session 记录和
我花了一周的时间研究这个主题,发现没有语言能够正确满足 IEEE 754 规范。 甚至 GCC 也不尊重相关的 C99 部分(它忽略了 FENV_ACCESS 编译指示,并且我被告知我的工作示例纯粹是
有很多 IEEE 标准。几乎所有语言都保证实现 IEEE 754 二进制 float 。 最佳答案 我认为这只是流水号,就像 IRC 有 RFC1459 关于ieee-754 - IEEE 754 f
我们在类里面有一个作业,要使用 c 从十进制转换为单精度,但我完全迷失了。 这是作业: The last part of this lab involves coding a short c algo
我使用的是在 SoftFloat 库中实现的半 float (阅读:100% IEEE 754 兼容),为了完整起见,我希望为我的代码提供与 float.h> 用于 float、double 和 lo
我很难理解IEEE 754舍入约定: 四舍五入为正无穷大 四舍五入为负无穷大 无偏到最接近的偶数 如果我在二进制点的右边有一个由9位组成的二进制数,并且我需要使用最右边的3位来确定舍入该怎么办? 这是
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我创建了以下程序来查找 float 的位模式。但我的计算结果有所不同: #include int main(void){ float f = 1.234; char *ch;
我在 18 位软核处理器目标上有一个 gcc 交叉编译器定义了以下数据类型:18 位整数、36 位长整型和 36 位 float (单精度)。现在我的重点是浮点运算。由于宽度是非标准(36位),我有以
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
Analog Devices 的 BFF-533 处理器不提供原生浮点支持,但提供浮点仿真。 使用 IDE VisualDSP++,用户可以在高性能浮点和严格的 IEEE 合规性之间进行选择。 据我了
我在没有浮点单元的处理器上工作,所以我必须为用户界面使用固定或自定义浮点类型。 对于这三种类型,say a multiply 的性能如何: IEEE float (32) 具有 16 位有符号值和有符
我对浮点数的工作原理有很好的理解,但我想知 Prop 体的指数和尾数大小是如何决定的。它们在某些方面是最优的吗?如何测量浮点表示的最优性(我假设有几种方法)?我想这些问题在官方标准中得到了解决,但我无
任何人都建议使用良好的压缩算法,该算法可与 double 浮点值一起很好地工作?我们发现,对于浮点值的二进制表示,使用常见的压缩程序(例如Zip,RAR,7-Zip等)会导致非常差的压缩率。 我们需要
我正在尝试将 0.0000211 转换为二进制。目前我的理解是这样的: E = -偏差 + 1。偏差 = 15,E = -14 符号位和指数 = 0。 所以我有: 0 00000 ?????????
我试图找出 ieee 754 中存在多少个不同的整数。我得到的数字是 1778384895,但我找不到任何资源来检查自己。预先非常感谢。 最佳答案 我将假设单精度 float 。 我们得到了零,虽然可
在运行 32 位 GCC 7.3.0 的特定在线判断中,这个: #include volatile float three = 3.0f, seven = 7.0f; int main() {
我是一名优秀的程序员,十分优秀!