Double和Float共存实现
Double and Float coexisting implementation
我有一个非常大的(而且结构又旧又丑,从 Fortran 移植到 C#)数学库,现在所有的计算都是使用双精度数完成的(因为有不准确的地方)。但是,为了将结果与旧实现的结果进行比较,我们有时必须切换回浮点数 - 以检查移植的代码是否正确。
我的想法是以某种方式从第一个库生成第二个库,其中所有变量和调用的方法都被相应的 float 实现替换。是否有任何自动解决方案允许在 float 和 double 之间切换而无需手动实现所有代码两次?我说的是 30000 多行代码。
代码生成可能是您的最佳选择 - 使用相同的源代码两次,但将所有 float
操作替换为 double
并自动在另一组中进行一些全局替换。
如果您想保留纯 C# 源代码,您可以滥用 using
指令。有两个独立的项目 - 一个用于 float
,另一个用于 double
。让他们都使用相同的源代码文件(一个将拥有它们,另一个将只有链接)。其中一个项目将有一个条件编译常量 FLOAT
。您将使用例如 float
或 double
而不是在您的源代码中使用Number
,定义为
#if FLOAT
using Number = float;
#else
using Number = double;
#endif
Number
的正确类型将在编译时替换,因此类型推断等一切都可以正常工作。 Visual Studio 如果源中存在仅影响使用相同链接源代码文件的项目之一的问题,2015 甚至会发出警告。
我有一个非常大的(而且结构又旧又丑,从 Fortran 移植到 C#)数学库,现在所有的计算都是使用双精度数完成的(因为有不准确的地方)。但是,为了将结果与旧实现的结果进行比较,我们有时必须切换回浮点数 - 以检查移植的代码是否正确。
我的想法是以某种方式从第一个库生成第二个库,其中所有变量和调用的方法都被相应的 float 实现替换。是否有任何自动解决方案允许在 float 和 double 之间切换而无需手动实现所有代码两次?我说的是 30000 多行代码。
代码生成可能是您的最佳选择 - 使用相同的源代码两次,但将所有 float
操作替换为 double
并自动在另一组中进行一些全局替换。
如果您想保留纯 C# 源代码,您可以滥用 using
指令。有两个独立的项目 - 一个用于 float
,另一个用于 double
。让他们都使用相同的源代码文件(一个将拥有它们,另一个将只有链接)。其中一个项目将有一个条件编译常量 FLOAT
。您将使用例如 float
或 double
而不是在您的源代码中使用Number
,定义为
#if FLOAT
using Number = float;
#else
using Number = double;
#endif
Number
的正确类型将在编译时替换,因此类型推断等一切都可以正常工作。 Visual Studio 如果源中存在仅影响使用相同链接源代码文件的项目之一的问题,2015 甚至会发出警告。