问题 如何使用整数进行浮点计算


我有一个协处理器连接到主处理器。某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢。

现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值。然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围。所以我的问题是,正确做到这一点的最快方法是什么。


10552
2018-04-09 18:41


起源

了解浮点数学的工作原理。这很容易。你应该在学校获得大部分必要的信息。其余的可以在网上找到(使用维基百科,谷歌等)。并实现浮点运算例程。 - Alexey Frunze
但这是一种缓慢的方法。我想要有效的东西。 - MetallicPriest
@AlexeyFrunze OP已经说仿真太慢了。这不是实现浮点的问题。 - sfstewman
那么,当问题被定义并且足够狭窄时,可以做一些有效的事情。目前的问题太广泛/笼统。 - Alexey Frunze
fastest & properly......提出具体问题。您需要计算的公式或其他类似的公式。我们怎么能给你 fastest 和 proper 解决一个未定义的问题? - Alexey Frunze


答案:


你说仿真太慢了。我想你的意思是模拟浮点数。如果缩放整数是唯一剩下的替代方法是定点数学,但它也不是很快,即使它比模拟浮点数快得多。

此外,你永远不会逃避使用缩放整数和 定点数学,你会减少 动态范围 而不是浮点数。

但是,如果事先知道您的范围,则可以针对您需要的范围调整定点数学实现。

这是 一篇关于定点的文章。诀窍的要点是决定如何拆分变量,数字的低部分和高部分的位数。

完全实现C的固定点可以 在这里找到。 (BSD许可证。)那里 是其他人


13
2018-04-09 18:45



这意味着,这种优化应该根据具体情况进行。没有银弹。 - Alexey Frunze
确实是@AlexeyFrunze。 OP案例似乎很特别。 - Prof. Falken
几乎 +1。给出的链接都是纯粹的 C一个是Java。我喜欢GnuPGP用于多字算术; 一致 汇编程序用于在可用时获得更快的多字操作。我想一个 固定点 “C”库也可以从中受益。虽然定点较少 动态范围,它也少了很多 土地思想特别是考虑到了 嵌入式 标签。 - artless noise
@artlessnoise,对不起,我不确定你的意思。 - Prof. Falken
所有部分都是哪一部分? magicfixedpoint 似乎是Java。 'C'库只是固定点,不包括超越函数。你也可以这样做 BIGNUM (或多字)类型的固定点,它增加了动态范围。这可以有效地完成 carry 硬件。浮点也有 动态精度,值越大越远 eta 是。固定点没有这个问题;只是说你的答案需要一点平衡。浮点不是灵丹妙药。 - artless noise


除了@Amigable Clark Kant的建议, 安东尼威廉姆斯的定点数学库 提供了一个C ++ fixed 几乎可以互换使用的类 float 要么 double 在ARM上,与软件浮点相比,性能提高了5倍。它包括一个完整的 fixed 使用CORDIC算法的标准数学库的点版本,包括trig和log函数等。


3
2018-04-10 10:26



另一个同类项目正在进行中 谷歌托管项目 和 代码项目链接,这些似乎有更多的完整的图书馆,包括一些超越的功能。 - artless noise