【问题标题】:data structures for floating point operation in fixed point processor定点处理器中浮点运算的数据结构
【发布时间】:2013-03-31 04:36:34
【问题描述】:

我需要对用于旧应用程序的定点处理器进行编程。请求新功能,这些功能需要大动态范围,即使在缩放之后也很可能超出定点范围。由于处理器不会因为几个原因而改变,我计划结合基于定点算术的浮点运算——基本上是基于软件的方法。我想为底层定点处理器定义一些数据结构来表示 C 中的浮点数。有可能做吗?我打算使用 IEEE floating point representation 。什么样的数据结构有利于实现乘法、除法、加法和减法等基本运算。是否已经有一些 C /C++ 中可用的开源库?

【问题讨论】:

  • 过去几乎每个平台都有浮点仿真库。其中一些应该仍然通过谷歌浮动。

标签: c++ c data-structures floating-point fixed-point


【解决方案1】:

大多数不支持本机浮点的微控制器 C 开发工具都提供了用于浮点运算的软件库。即使您使用汇编程序进行编程,您也可能会使用这些库。 (只是好奇,您使用的是哪种处理器和哪些开发工具?)

但是,如果您认真地编写自己的浮点库,最有效的方法是将例程视为对整数进行操作的例程。您可以使用联合或类似以下的代码在浮点和整数表示之间进行转换。

uint32_t integer_representation = *(uint32_t *)&fvalue;

请注意,这本质上是未定义的行为,因为浮点数的格式未在 C 标准中指定。

如果您坚持使用匹配的浮点和整数类型(通常是 32 位或 64 位类型),问题会容易得多,这样您就可以将例程视为普通的 integer 例程,例如,例如,addition 采用两个 32 位整数表示的浮点值,并返回一个 32 位整数表示的结果。

此外,如果您自己使用这些例程,您可能会不执行标准的部分内容,例如异常标志、次正规数、NaN 和 Inf 等。

【讨论】:

    【解决方案2】:

    您实际上并不需要 任何 数据结构来执行此操作。您只需使用整数来表示浮点编码,使用整数来表示解压缩的符号、指数和有效数字字段。

    【讨论】:

    • 您所描述的是一个完整的类,伪装成隐式约定。含义:您确实需要数据结构来执行此操作。
    • 您不需要任何 非平凡 数据结构。虽然我们在这里,但类不是数据结构,对于手头的问题,没有什么需要使用类。
    • 对浮点数的操作通常需要单独使用和更改符号、指数和尾数。与显式存储三个字段相比,将数据结构压缩为一个 32 位位模式将涉及大量不必要的提取和合并。
    • @PatriciaShanahan:它涉及少量的额外工作,除了最简单的浮点运算之外,这与舍入/上溢/下溢逻辑相形见绌。这也是许多(大多数?)软浮点库的编写方式,因为它允许它们充当硬件功能的直接替代品。存储和传递未打包的值很有吸引力,但在我的经验中很少使用。
    • 关于斯蒂芬所说的一个例子,看看这个线程,它显示了 IEEE-754 单精度倒数的代码:stackoverflow.com/questions/9011161/…
    猜你喜欢
    • 2023-03-17
    • 2019-08-26
    • 1970-01-01
    • 2018-10-25
    • 2023-04-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多