将所有浮点文字设置为浮点数 MSVC++
Set all floating point literals to floats MSVC++
我正在用 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 类型操作提升性能,而不是惩罚!
菲尔
这是对我自己的问题的(不完全)回答。
我发现一个被多次调用的小函数(对 sin 的快速逼近)没有将其文字转换为 MYFLT。这额外的计算命中也意味着编译器没有内联它。这个功能占了大部分差异。一些进一步的分析似乎表明访问 std::vector<float>
比 std::vector<double>
慢(如果重要的话,我正在使用 [] 进行访问)。用原始固定大小的数组替换 std::vectors
稍微加快了 double 实现的速度,并显着缩小了 float 实现的差距。 float 版本现在只比 double 版本慢 10% 左右。但绝对不会因为 RAM 访问或矢量化而增加速度。我想我需要更仔细地考虑我的循环才能在那里获得任何好处。
我想这里的结论(再一次)是编译器非常擅长优化代码 - 使用它并进行仔细的分析比尝试自己盲目要好得多 "optimisations" 这实际上可能会产生负面影响,例如停止编译器执行良好的内联。
您想要的是 #define MYFLTCONST(x) x##f
或 #define MYFLTCONST(x) x
,具体取决于您是否要为 float
附加 f
后缀。
我正在用 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 类型操作提升性能,而不是惩罚!
菲尔
这是对我自己的问题的(不完全)回答。
我发现一个被多次调用的小函数(对 sin 的快速逼近)没有将其文字转换为 MYFLT。这额外的计算命中也意味着编译器没有内联它。这个功能占了大部分差异。一些进一步的分析似乎表明访问 std::vector<float>
比 std::vector<double>
慢(如果重要的话,我正在使用 [] 进行访问)。用原始固定大小的数组替换 std::vectors
稍微加快了 double 实现的速度,并显着缩小了 float 实现的差距。 float 版本现在只比 double 版本慢 10% 左右。但绝对不会因为 RAM 访问或矢量化而增加速度。我想我需要更仔细地考虑我的循环才能在那里获得任何好处。
我想这里的结论(再一次)是编译器非常擅长优化代码 - 使用它并进行仔细的分析比尝试自己盲目要好得多 "optimisations" 这实际上可能会产生负面影响,例如停止编译器执行良好的内联。
您想要的是 #define MYFLTCONST(x) x##f
或 #define MYFLTCONST(x) x
,具体取决于您是否要为 float
附加 f
后缀。