【发布时间】:2012-03-04 01:29:27
【问题描述】:
我正在为 AVR 平台开发,我有一个问题。我不希望浮点库与我的代码链接,但我喜欢使用范围为 0.0 ... 1.0 而不是 0...255 和 0...1023 的模拟值的概念,这取决于偶数我是使用端口作为输入还是作为输出。
所以我决定将输入/输出函数的参数分别乘以 1023.0 和 255.0。现在,我的问题是:如果我这样实现划分:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
GCC(打开 -O3 标志)是否会将编译时浮点乘法(在编译时已知并转换为整数类型)优化为整数运算? (我知道当使用这些带有非常量参数的宏时,优化是不可能的;我只想知道在其他情况下是否会这样做。)
【问题讨论】:
-
这不应该是乘法,而不是除法吗? (
analog_out(7, 0.5)变为将0.5*255写入端口 7,而不是从 1/510 中截取的 0 写入)... -
试试看吧!
gcc -S将生成程序集转储。您可能需要-O2 -ffast-math,而不是-O3(-O3启用几乎总是净失败的优化,例如过度激进的内联;它旨在用于一个文件您的程序花费了 90% 的时间)。 -
嗯,它是一个库,所以程序将在其中花费 90% 以上的时间;)但无论如何,谢谢你的想法。
-
你们为什么无缘无故地否决这个问题?
-
解释该死的反对票!
标签: c optimization gcc floating-point avr