我正在用C ++编写一些数字代码,我希望能够在使用double和float之间进行交换。因此我添加了一个#define MYFLT,我可以根据需要制作浮动或双重。但是,我如何处理各种数字文字。 例如
MYFLT someNumber = 1.2;
MYFLT someOtherNumber = 1.5f;
当MYFLT为浮点数时,为第一行提供编译器警告,当MYFLT为双精度时,为第二行提供编译器警告。我知道这是一个简单的例子,但是在其他情况下,我有更长的文字表达,并且浮点数最终可以转换为双精度,然后结果返回浮点数,我认为这会让我失去显着的性能。我该怎么处理这个?
我可以做像
这样的事情MYFLT someNumber = MYFLT(1.2);
MYFLT someOtherNumber = MYFLT(1.5);
但这很乏味。我假设如果我这样做,编译器就足够聪明,只需要在需要时使用浮点数(任何人都可以确认吗?)。如果有一个MSVC ++编译器开关或#define会告诉编译器将所有浮点文字视为浮点数而不是双精度数,那会更好。这样的转换是否存在?
即使我将所有文字包装在上面,当我使用float而不是double时,我的代码运行速度会慢50%。我期待通过simd类型操作提升性能,而不是惩罚!
菲尔
答案 0 :(得分:1)
您需要的是#define MYFLTCONST(x) x##f
或#define MYFLTCONST(x) x
,具体取决于您是否需要附加f
后缀float
。
答案 1 :(得分:0)
这是对我自己的问题的答案(不完全)。
我发现一个被称为多次的小函数(快速逼近罪恶)并没有将其文字投射为MYFLT。额外的计算量也意味着编译器没有内联它。这个功能占了大部分的差异。一些进一步的分析似乎表明访问std::vector<float>
比std::vector<double>
慢(我正在使用[]进行访问,如果重要的话)。用原始固定大小的数组替换std::vectors
加快了双重实现的速度,并为浮动实现显着缩小了差距。浮动版本现在只比双版本慢约10%。但是由于RAM访问和矢量化,绝对没有速度增加。我想我需要更仔细地思考我的循环以获得任何好处。
我想这里的结论(又一次)是编译器非常擅长优化代码 - 使用它并且仔细分析比尝试做自己的盲人&#做得好得多# 34;最佳化&#34;这可能实际上有负面影响,比如停止编译器执行良好的内联。