我使用c++来计算各种类型的特殊函数(例如Lambert函数,用于求值求逆的迭代方法等)。在许多情况下,显然有更好的方法直接处理尾数和指数。
我找到了很多如何提取尾数和指数部分的答案,但是所有这些都只是“学术案例,计算速度不是很有效”,这对我来说一点用处都没有(我使用尾数和指数的动机是为了提高计算能力速度)。有时我需要调用某个特定的函数约十亿次(非常昂贵的计算),因此每个保存的计算工作都很好。并且使用“frexp”将尾数返回为double不太合适。
我的问题是(对于具有IEEE 754浮点的c++编译器):
1)如何读取浮点数/双数尾数的特定位?
2)如何将整个尾数读为整数/浮点数/双字节?
3)关于指数的问题与1),2)相同。
4)与写题1),2),3)相同的问题。
如果我直接使用尾数或指数,我的动机是更快的计算速度。我想必须有一个非常简单的解决方案。
最佳答案
我知道我的信号处理工作感觉很好,但事实是,指数和尾数并不能简单地用作单独的数字。 IEEE754指定了一些特殊情况,以及偏移量等。
工程经验告诉我:通常,以“简单解决方案”结尾的句子是不正确的。
但是,绝对不正确(我将在最后提到一个示例)。
在IEEE754浮点数上,现实世界中对优化的使用非常可靠。但是,我发现,由于后来的x86处理器具有执行SIMD(单指令,多个数据)的能力,并且浮点运算速度与大多数“移位”运算一样快,因此我普遍怀疑您不建议这样做。尝试自己一点点地做到这一点。
通常,由于IEEE754是标准,因此您会在任何地方找到有关如何将其存储在特定体系结构中的文档。如果您已经看过,至少应该已经找到了维基百科的文章,该文章解释了如何进行1)和2)(它并不像您想的那样静态)。
更重要的是:
不要尝试比编译器更聪明。除非您明确知道如何向量化多个相同的操作,否则您可能不会这样做。
试用您的特定编译器的数学优化。如前所述,如今,他们通常不做很多事情; CPU进行浮点计算的速度不一定比在整数上慢。
我宁愿看看您的算法,并在那里寻找优化的潜力。
另外,在我讲的同时,让我们介绍一下VOLK( vector 优化核仁库),这是一个主要用于信号处理的数学库。 http://libvolk.org有一个概述。查看以32f开头的kernels,例如32f_expfast。您会注意到有不同的实现,即通用的和CPU优化的实现,每个SIMD指令集都不同。
关于c++ - 如何在C++上对double或float的尾数和指数部分进行运算(快速)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34698067/