【发布时间】:2015-04-29 21:24:52
【问题描述】:
我正在用 C++ 编写一些数字代码,我希望能够在使用双精度和浮点数之间进行切换。因此,我添加了一个#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 类型的操作来提升性能,而不是惩罚!
菲尔
【问题讨论】:
-
可能很有趣stackoverflow.com/questions/3426165/…。例如。你为什么要这样做?
-
提示:
typedef可能比使用#define更好 -
如果您不进行矢量计算,SIMD 并不会真正有帮助,矢量化随机计算并不容易并且这样做会带来性能优势。此外,MSVC 通常会为单精度变量使用双精度指令。这意味着有时它会来回转换为双精度,即使您只有浮点数。也许你可以用 /fp:fast 禁用它,但要注意额外的副作用。
-
我确实有一些矢量计算,但也许我的循环格式不够好,无法进行矢量化。我还将大量数据写入 ram(几 GB),并期望通过将数据减半来加快速度。我想这是一个确保你分析我们的代码的情况!
-
MYFLT(1.2) 将导致双重舍入,这是不好的。您需要附加 f 后缀以确保它正确四舍五入到浮点精度
标签: c++ visual-c++