問題在標題中。看起來,我交付給我的客戶的軟件具有不同的行爲,具體取決於一些參數以整數或浮點形式傳遞。我使用MinGW爲我的客戶構建了一個DLL,並將其集成到他的Visual Studio項目中,該項目使用了其他編譯器(不知道哪個,我猜VS是標準的)。在C++中依賴於浮點表達式是依賴於編譯器的嗎?
難道浮筒的表現不同於他嗎?
感謝擡起頭, 查爾斯
問題在標題中。看起來,我交付給我的客戶的軟件具有不同的行爲,具體取決於一些參數以整數或浮點形式傳遞。我使用MinGW爲我的客戶構建了一個DLL,並將其集成到他的Visual Studio項目中,該項目使用了其他編譯器(不知道哪個,我猜VS是標準的)。在C++中依賴於浮點表達式是依賴於編譯器的嗎?
難道浮筒的表現不同於他嗎?
感謝擡起頭, 查爾斯
是的,浮點表示是編譯器相關的。
理論上,您可以使用std::numeric_limits
來確定表示的主要方面,例如它是IEEE 754,還是二進制或十進制。
實際上除了內存佈局之外,你不能依賴這個,因爲在主編譯器g ++中,浮點操作的語義會受到優化選項的強烈影響(例如,NaN
是否與自身等同或不)。
I.e.在實踐中,它不僅依賴於編譯器,而且還依賴於選項。
給定平臺的高效編譯器通常將符合該平臺的浮點標準存儲器佈局,例如, Windows中的IEEE 754(標準起源於PC平臺)。所以,在g ++和Visual C++之間交換時,浮點值通常應該工作正常。一個例外是,g ++ long double
映射到80位IEEE 754,而使用Visual C++映射到普通的double
即64位,並且可能是。
嗯,是編譯器真的允許優化'NaN == NaN'到語義不可預測的程度?我對此表示懷疑。如果使用IEC 559,則使用IEC 559,其規則應該是福音。 –
@LightnessRacesinOrbit:在我看來這是不允許的。但是,它確實如此。 –
你有沒有證據支持這一說法? –
相關:http://stackoverflow.com/questions/18494237/floating-point-mismatch-between-compilers-visual-studio-2010-and-gcc – NathanOliver
總之:是的。 –
通常,鏈接使用不同編譯器編譯的代碼不是一個好主意 - 不能保證它能正常工作。您通常應該始終使用* exact *相同的編譯器構建所有內容。 –