c++ - 如何在 c++ 中对 double 或 float 的尾数和指数部分进行(快速)操作?

标签 c++ ieee-754 exponent numerical-computing mantissa

我使用 C++ 来计算各种类型的特殊函数(例如 Lambert 函数、求逆求值的迭代方法等)。在许多情况下,直接使用尾数和指数显然是更好的方法。

我找到了很多关于如何提取尾数和指数部分的答案,但是它们都只是“计算速度不是很有效的学术案例”,对我来说有点用处(我使用尾数和指数进行运算的动机是提高计算速度)。有时我需要调用一些特定的函数大约十亿次(非常昂贵的计算)所以每次保存的计算工作都很好。并且使用返回尾数为 double 的“frexp”不是很合适。

我的问题是(针对具有 IEEE 754 float 的 C++ 编译器):

1)如何读取float/double的特定位的尾数?

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

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

4) 与 1), 2), 3) 相同的问题用于写作。

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

最佳答案

In many cases there is an obviously better approach to work with a mantissa and exponent directly.

我知道从我的信号处理工作中感觉非常好,但事实是指数和尾数不能简单地用作单独的数字; IEEE754 规定了相当多的特殊情况,以及偏移量等。

I suppose that there must be a very simple solution.

工程经验告诉我:以“一个简单的解决方案”结尾的句子通常是不正确的。

"academic cases"

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

IEEE754 float 的优化在现实世界中有非常可靠的使用。但是,我发现随着后来的 x86 处理器执行 SIMD(单指令、多数据)的能力以及浮点与大多数“移位”操作一样快的总体事实,我通常怀疑你不建议这样做尝试自己在一个位层面上做到这一点。

一般来说,由于 IEEE754 是一个标准,您会在任何地方找到关于它如何存储在您的特定架构上的文档。如果您看过,您至少应该找到解释如何执行 1) 和 2) 的维基百科文章(它并不像您想象的那样静态)。

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

试验您的特定编译器的数学优化。如前所述,如今他们通常做的不多; CPU 进行浮点计算并不一定比整数计算慢。

我宁愿看看你们的算法并寻找优化的潜力。

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

关于c++ - 如何在 c++ 中对 double 或 float 的尾数和指数部分进行(快速)操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34698067/

相关文章:

c++ - Qt组合框崩溃

c++ - "Using"声明范围仅在当前类?

c++ - 无法创建其中包含空元组的一元元组 (c++0x)

floating-point - IEEE 24 位 float 的最小正值是多少?

python - 我的素数程序中的指数抛出内存错误,我该如何解决?

modulo - 如何计算大指数的模数?

swift - Swift 中的最大公共(public)指数

c++ - 是否可以从 FTP 地址添加到 visual studio 的包含路径?

c - ubuntu 64 位上的单精度浮点表示不正确

assembly - float 如何存储在 CPU 中?