【问题标题】:How to do floating point calculations with integers如何用整数进行浮点计算
【发布时间】:2013-04-01 08:35:36
【问题描述】:

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

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

【问题讨论】:

  • 了解浮点数学的工作原理。这很容易。你应该已经在学校获得了大部分必要的信息。其余的可以在网上找到(使用维基百科、谷歌等)。并实现浮点算术例程。
  • 但这是一个缓慢的方法。我想要一些高效的东西。
  • @AlexeyFrunze OP 已经说过仿真太慢了。这不是实现浮点的问题。
  • 好吧,当问题被定义并且足够狭窄时,可以做一些有效的事情。当前的问题过于宽泛/笼统。
  • fastest & properly... 给出具体问题。您需要计算的公式或类似的东西。对于未定义的问题,我们如何为您提供fastestproper 的解决方案?

标签: c floating-point embedded fixed-point


【解决方案1】:

你是说仿真太慢了。我猜你的意思是模拟浮点数。如果缩放整数不够,唯一剩下的选择是定点数学,但它也不是很快,尽管它比模拟浮点数快得多。

此外,你永远不会逃避这样一个事实,即使用缩放整数和fixed point math,你将得到比使用浮点更少的dynamic range

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

Here is关于定点的文章。该技巧的要点是决定如何拆分变量,数字的低位和高位有多少位。

C 的定点的完整实现可以是found here。 (BSD 许可证。)那里有are others

【讨论】:

  • 这意味着,应该根据具体情况进行此类优化。没有灵丹妙药。
  • @AlexeyFrunze,确实如此。 OP 案例似乎很特别。
  • 几乎 +1。给出的链接都是纯C,一个是Java。我喜欢 GnuPGP 用于多字算术; in-line 汇编器用于在可用时获得更快的多字操作。我认为 fixed point 'C' 库也可以从中受益。虽然定点的动态范围较少,但它的land minds也少很多,尤其是考虑到嵌入的标签。
  • @artlessnoise,抱歉,我不确定你的意思。
  • 全部是哪一部分? magicfixedpoint 似乎是 Java。 “C”库只是定点,不包括超越函数。你也可以做bignum(或多字)类型的定点,这样增加了动态范围。这可以通过carry 硬件有效地完成。浮点也有动态精度,值越大,eta 越远。定点不存在这个问题;只是说你的答案需要一点平衡。浮点数不是万能的。
【解决方案2】:

除了@Amigable Clark Kant 的建议之外,Anthony Williams' fixed point math library 还提供了一个 C++ fixed 类,它几乎可以与 floatdouble 互换使用,并且在 ARM 上,与软件浮点相比,性能提高了 5 倍。它包括一个完整的fixed 点版本的标准数学库,包括使用 CORDIC 算法的三角函数和日志函数等。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多