3

1)我的 C 算法中有很多常量。2)我的代码在浮点和定点都有效。

现在,这些常量由函数 float2fixed 初始化,因此在浮点中它什么也不做,而在定点中,它找到它们的定点表示。例如,如果工作在浮点数中,0.5f 保持 0.5f,而它使用 pow() 例程,如果工作在定点上,则变为 32768,定点表示为 Qx.16。

这很容易维护,但实际上需要花费大量时间来计算这些定点常量(pow 是一个浮点函数)。在 C++ 中,我会使用一些元编程,因此编译器会在编译时计算这些值,因此在运行时不会受到影响。但在 C 中,这是不可能的。或者是吗?有人知道这样的技巧吗?有没有足够聪明的编译器来做到这一点?

期待任何答案。

一个

4

4 回答 4

4

而不是(unsigned)(x*pow(2,16))用来做你的定点转换,把它写成 (unsigned)(0.5f * (1 << 16))

这应该是可接受的编译时常量表达式,因为它只涉及内置运算符。

于 2009-06-10T23:32:09.160 回答
2

使用定点时,您是否可以编写一个程序来获取浮点值并将它们转换为定点类型的正确常量初始化器,以便您有效地在编译中添加一个生成定点值的步骤。

这样做的一个优点是您可以定义和声明常量,const这样它们就不会在运行时改变 - 而对于初始化函数,当然,值必须是可修改的,因为它们只计算一次。


我的意思是编写一个简单的程序,可以扫描可能读取的公式行:

const double somename = 3.14159;

它会读取并生成:

const fixedpoint_t somename = { ...whatever is needed... };

您设计操作以使其易于管理这两种符号 - 所以您的转换器可能总是读取文件,有时会重写它。

datafile.c:   datafile.constants converter
        converter datafile.constants > datafile.c
于 2009-06-10T23:29:40.473 回答
0

最新版本的 GCC(大约 4.3)增加了使用 GMP 和 MPFR 通过评估更复杂的常量函数来进行一些编译时优化的能力。这种方法使您的代码简单且可移植,并相信编译器可以完成繁重的工作。

当然,它可以做的事情是有限制的,如果不去查看程序集,就很难知道它是否正在优化给定的实例。但这可能值得一试。这是更改日志中描述的链接

于 2009-06-11T04:56:44.493 回答
0

在纯 C 语言中,您无能为力。您需要在某个时候进行转换,并且编译器不允许您在编译时调用有趣的用户提供的函数。从理论上讲,您可以尝试诱使预处理器为您执行此操作,但这是通向完全疯狂的捷径(即您必须在宏中实现 pow() ,这非常可怕)。

我能想到的一些选择:

  1. 在磁盘上维护一个持久缓存。至少那样它只会慢一次,尽管你仍然需要加载它,确保它没有损坏等等。

  2. 正如另一条评论中提到的,无论如何都要使用模板元编程并使用 C++ 编译器进行编译。大多数 C 与 C++ 编译器一起工作得很好(可以说更好)。

嗯,我想我能想到的就这么多了。祝你好运。

于 2009-06-10T23:11:03.617 回答