2015-08-21 64 views
1

我有一個非常大的(以及舊的和醜陋的結構,從Fortran移植到C#)數學庫,現在所有計算都使用雙精度(因爲有不準確性)。但是,爲了將結果與舊實現的結果進行比較,我們有時必須切換回浮動 - 以檢查移植的代碼是否正確。Double和Float共存實現

我的想法是以某種方式從第一個庫中生成第二個庫,其中所有變量和被調用的方法都被相應的float實現替換。有沒有自動的解決方案,允許切換浮動和雙打而無需手動執行所有代碼兩次?我正在談論30000多行代碼。

+0

我可以看到3件你可以做的事情。 1:'用C#重寫整個庫,並用double'替換float 2:'使用你現有的庫並在double調用時漂浮在所有的調用上,非常沒有意義,我會建議只用float,除非可以。是錯誤的計算3:'使用你現有的庫和調用浮動' – Bauss

+0

我必須同意Bauss,沒有辦法使庫通用,並將其限制爲float或double類型。然而,如果你真的需要這樣做,你可以用一個接受double或float的重載實現每個方法。 – GeorgDangl

+0

即使使用泛型也無濟於事(所以你可以做一些類似'Add (0.3,0.4)'。請參閱http://stackoverflow.com/questions/1348594/is-there-ac-sharp-generic-constraint -for-real-number-types – Sascha

回答

2

代碼生成可能是您的最佳選擇 - 使用相同的源代碼兩次,但將所有float操作替換爲double,並自動替換其他集合中的全局替換。

如果你想保持純粹的C#源代碼,你可以濫用using指令。有兩個單獨的項目 - 一個用於float,另一個用於double。他們都使用相同的源代碼文件(其中一個將在物理上擁有它們,另一個將僅具有鏈接)。其中一個項目將有一個條件編譯常數FLOAT。代替在源代碼中使用floatdouble,您將使用例如Number,定義爲

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

Number適當類型將在編譯時被取代,所以像類型推斷等一切正常。 Visual Studio 2015甚至會警告你,如果源代碼中有問題只會影響使用相同鏈接源代碼文件的項目之一。

+0

我已經做了這樣的事情,雖然它會工作,但它只是感覺髒... – dman2306

+0

@ dman2306好吧,如果有沒有乾淨和慣用的選項,髒不*真*髒 - 它可能仍然是最佳的解決方案。煩人的部分是,你不能在同一個項目中保持兩個實現,因爲沒有辦法,例如有一個編譯器不斷地申請一個命名空間,另一個申請一個命名空間療法。 – Luaan

+0

我認爲這將解決它在我的情況。 – LionAM