使用gcc预处理器创建一个余弦表

mar*_*ert 3 c gcc ps3 c-preprocessor

我希望在编译时创建一个余弦表.有没有办法在没有硬编码的情况下做到这一点?

lep*_*pie 12

为什么不硬编码呢?我不知道他们正在计划的余弦函数的结果有任何变化,而不是100年左右.

  • 很久以前类似的轻浮假设导致2000年问题:) (2认同)
  • 这是一个数学常数所以它不会改变,永远不会改变!然而,可能改变的是单位.也许200年后,500将是正确的角度.但即使发生了这种情况,也与运行时是否生成硬编码值无关. (2认同)

Mar*_*rkR 9

我不相信预先计算正弦表会导致性能提升.我建议:

  1. 对您的应用程序进行基准测试,调用fcos()来确定它是否足够快.如果是,请停在这里.
  2. 如果它确实太慢,请考虑使用-ffast-math,如果它对您的使用是可接受的.

查找表,特别是大表,将增加需要保存在CPU缓存中的程序的大小,从而降低其命中率.这反过来会减慢应用程序的其他部分.

我假设你在一个令人难以置信的紧密循环中这样做,因为这是唯一可能无论如何重要的情况.

如果您确实发现使用查找表是有益的,为什么不在运行时预先计算它?它对启动时间几乎没有任何影响(除非它是一个huuuuuge).实际上在运行时这样做可能会更快,因为你的CPU可能比你的光盘加载浮动更快.


小智 8

使用C++,您可以使用模板元编程在运行时生成查找表.

现在,这是一个标准的C技巧,可能会或可能不会实现你想要的.

  1. 编写一个生成余弦表C语句的程序(比如cosgen)(即你想要的代码).
  2. 运行cosgen并将输出(c代码)转储到文件中,比如cos_table.c
  3. 在主程序中,使用#include"cos_table.c"将表插入到所需的位置.


Oll*_*ers 5

您可以使用您喜欢的任何脚本语言生成它并包含结果.使用make可以让脚本语言随时更改源代码.它很难编码为C,但不是你,真的.