我正在阅读优化程序的代码(Nelder Mead,SQP ......)。语言是C ++,Python。我观察到通常会执行从double到float的转换,或者使用double resp复制方法。浮动参数。为什么它在优化例程代码中有利可图,并且它是否重要?在我自己的C ++代码中,我应该注意类型double和float以及为什么?
亲切的问候。
答案 0 :(得分:6)
double
和float
之间的选择往往更多地取决于空间需求而非速度。现代处理器能够在double
上快速运行。
当使用可以一次操作多个值的SIMD指令(例如SSE)时,浮点数可能比双倍更快。此外,如果操作比内存管道更快,float
的较小内存要求将加速整体操作。
答案 1 :(得分:2)
其他时候,我发现需要考虑在优化方面选择double和float类型包括:
正如另一个答案中所提到的,现代桌面处理器可以非常快速地处理双精度处理。但是,你必须问自己是否 真正需要双精度处理。我使用音频, 而且我唯一能想到我需要处理的地方 当使用高阶滤波器时,双精度数据将是 数值误差可以累积。大部分时间都可以避免这种情况 通过更加仔细地关注算法设计。有, 当然,其他科学或工程应用在哪里加倍 需要精确数据才能正确表示巨大的数据 动态范围。
即便如此,在考虑使用数据类型时花费多少精力的问题实际上取决于您的目标平台。如果平台能够以微不足道的开销来处理双打并且你有足够的内存,那么就没有必要关心自己了。查看测试代码的小部分以找出答案。
答案 2 :(得分:2)
在某些优化算法中,double
和float
之间的选择 not 在空间需求上比速度更多。例如,使用用于非线性优化中的内点法的惩罚或障碍方法,float
与double
相比精度不足,并且在算法中使用float
s将会产生垃圾。由于这个原因,惩罚和障碍方法在20世纪60年代没有被使用,但随着双精度数据类型的出现,后来被重新发现。 (有关这些方法的更多信息,请参阅Fiacco和McCormick的非线性规划:顺序无约束最小化技术(应用数学中的经典)。
另一个考虑因素是在许多优化算法中解决的基础线性系统的调节。如果您在牛顿迭代中解决的线性系统充分恶劣,那么您将无法获得这些系统的准确解决方案。
如果您考虑将double
替换为float
s,那么只有当精度损失不会危及您的数字时,才会这样做;即使空间限制迫使您这样做,您也应该确保数值结果的准确性不会受到影响。一旦为您正在处理的问题确保足够的准确性,您就可以担心空间和性能优化。您可以使用CUTEr test set来验证优化例程。