我有一個非常大的(以及舊的和醜陋的結構,從Fortran移植到C#)數學庫,現在所有計算都使用雙精度(因爲有不準確性)。但是,爲了將結果與舊實現的結果進行比較,我們有時必須切換回浮動 - 以檢查移植的代碼是否正確。Double和Float共存實現
我的想法是以某種方式從第一個庫中生成第二個庫,其中所有變量和被調用的方法都被相應的float實現替換。有沒有自動的解決方案,允許切換浮動和雙打而無需手動執行所有代碼兩次?我正在談論30000多行代碼。
我有一個非常大的(以及舊的和醜陋的結構,從Fortran移植到C#)數學庫,現在所有計算都使用雙精度(因爲有不準確性)。但是,爲了將結果與舊實現的結果進行比較,我們有時必須切換回浮動 - 以檢查移植的代碼是否正確。Double和Float共存實現
我的想法是以某種方式從第一個庫中生成第二個庫,其中所有變量和被調用的方法都被相應的float實現替換。有沒有自動的解決方案,允許切換浮動和雙打而無需手動執行所有代碼兩次?我正在談論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甚至會警告你,如果源代碼中有問題只會影響使用相同鏈接源代碼文件的項目之一。
我可以看到3件你可以做的事情。 1:'用C#重寫整個庫,並用double'替換float 2:'使用你現有的庫並在double調用時漂浮在所有的調用上,非常沒有意義,我會建議只用float,除非可以。是錯誤的計算3:'使用你現有的庫和調用浮動' – Bauss
我必須同意Bauss,沒有辦法使庫通用,並將其限制爲float或double類型。然而,如果你真的需要這樣做,你可以用一個接受double或float的重載實現每個方法。 – GeorgDangl
即使使用泛型也無濟於事(所以你可以做一些類似'Add(0.3,0.4)'。請參閱http://stackoverflow.com/questions/1348594/is-there-ac-sharp-generic-constraint -for-real-number-types –
Sascha