Double和Float共存实现

时间:2015-08-21 12:28:25

标签: c# automated-refactoring

我有一个非常大的(旧的和丑陋的结构,从Fortran移植到C#)数学库,现在所有的计算都是使用双精度完成的(因为存在不准确性)。但是,为了将结果与旧实现的结果进行比较,我们有时必须切换回浮点数 - 以检查移植的代码是否正确。

我的想法是以某种方式从第一个库生成第二个库,其中所有变量和被调用的方法都被相应的float实现替换。是否有任何自动解决方案允许在浮点数和双精度数之间切换而无需手动执行所有代码两次?我说的是超过30000行代码。

1 个答案:

答案 0 :(得分:3)

代码生成可能是您的最佳选择 - 使用相同的源代码两次,但使用float替换所有double操作,并自动替换另一组中的全局替换。

如果您想保留纯C#源代码,可以滥用using指令。有两个单独的项目 - 一个用于float,另一个用于double。让他们两个使用相同的源代码文件(一个将物理上,另一个只有链接)。其中一个项目将具有条件编译常量FLOAT。您可以使用以下代码,而不是在源代码中使用floatdoubleNumber,定义为

#if FLOAT
using Number = float;
#else
using Number = double;
#endif

Number的正确类型将在编译时被替换,因此类型推断等所有内容都能正常工作。 Visual Studio 2015甚至会警告您,如果源中的问题仅影响使用相同链接源代码文件的其中一个项目。