Double和Float共存的实现

本文关键字:实现 Float Double | 更新日期: 2023-09-27 18:09:10

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

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

Double和Float共存的实现

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

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

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

Number的正确类型将在编译时被替换,因此类型推断等一切都可以正常工作。Visual Studio 2015甚至会在源代码中出现问题时警告你,这些问题只影响到使用相同链接源代码文件的一个项目。