Double和Float共存实现

Double and Float coexisting implementation

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

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

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

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

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

Number 的正确类型将在编译时替换,因此类型推断等一切都可以正常工作。 Visual Studio 如果源中存在仅影响使用相同链接源代码文件的项目之一的问题,2015 甚至会发出警告。