如何操作(快速)尾数和指数部分的double或浮点数在c ++?

Mar*_*ník 2 c++ mantissa exponent numerical-computing ieee-754

我使用c ++来计算各种类型的特殊函数(例如Lambert函数,用于评估反演的迭代方法等).在许多情况下,直接使用尾数和指数有明显更好的方法.

我找到了许多答案如何提取尾数和指数部分,但是所有这些都只是"学术案例,计算速度不是很快",对我来说有点无用(我用尾数和指数操作的动机是改进计算速度).有时我需要调用一些特定功能大约十亿次(非常昂贵的计算),所以每个节省的计算工作都很好.并且使用将尾数作为double的"frexp"不太合适.

我的问题是(对于带有IEEE 754浮点的c ++编译器):

1)如何读取浮点数/双精度的尾数的具体位?

2)如何将整个尾数读入float/double的整数/字节?

3)与指数1),2)相同的问题.

4)与写入1),2),3)相同的问题.

如果我直接使用尾数或指数,我的动机是更快的计算.我想必须有一个非常简单的解决方案.

Mar*_*ler 6

在许多情况下,直接使用尾数和指数有明显更好的方法.

我知道从我的信号处理工作中感觉很好,但事实是,指数和尾数不仅仅是单独的数字; IEEE754规定了一些特殊情况和偏移等.

我想必须有一个非常简单的解决方案.

工程经验告诉我:以"简单解决方案"结尾的句子通常不正确.

"学术案例"

然而,绝对不是真的(我最后会提到一个例子).

IEEE754浮点数的优化实际使用非常可靠.但是,我发现,后来x86处理器能够执行SIMD(单指令,多数据)以及浮点与大多数"位移"操作一样快的总体事实,我通常怀疑你是不明智的尝试自己做一点点.

通常,由于IEEE754是标准,因此您可以找到有关它如何存储在您的特定架构中的文档.如果你看过,你至少应该找到维基百科文章解释如何做1)和2)(它不像你想象的那样静态).

更重要的是: 不要试图比编译器更聪明.你可能不会,除非你明确地知道如何矢量化多个相同的操作.

试验您的特定编译器的数学优化.如上所述,现在它们通常做得不多; 执行浮点计算的CPU并不比整数运算慢.

我宁愿看看你的算法,并寻找那里的优化潜力.

另外,当我在它的时候,让我们主要讲述VOLK(矢量优化内核库),这是一个用于信号处理的数学库.http://libvolk.org有一个概述.查看以32f开头的内核,例如32f_expfast.您会注意到每种SIMD指令集都有不同的实现,通用和CPU优​​化的实现.