2016-09-19 103 views
0

問題在標題中。看起來,我交付給我的客戶的軟件具有不同的行爲,具體取決於一些參數以整數或浮點形式傳遞。我使用MinGW爲我的客戶構建了一個DLL,並將其集成到他的Visual Studio項目中,該項目使用了其他編譯​​器(不知道哪個,我猜VS是標準的)。在C++中依賴於浮點表達式是依賴於編譯器的嗎?

難道浮筒的表現不同於他嗎?

感謝擡起頭, 查爾斯

+0

相關:http://stackoverflow.com/questions/18494237/floating-point-mismatch-between-compilers-visual-studio-2010-and-gcc – NathanOliver

+3

總之:是的。 –

+0

通常,鏈接使用不同編譯器編譯的代碼不是一個好主意 - 不能保證它能正常工作。您通常應該始終使用* exact *相同的編譯器構建所有內容。 –

回答

4

是的,浮點表示是編譯器相關的。

理論上,您可以使用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位,並且可能是

+0

嗯,是編譯器真的允許優化'NaN == NaN'到語義不可預測的程度?我對此表示懷疑。如果使用IEC 559,則使用IEC 559,其規則應該是福音。 –

+0

@LightnessRacesinOrbit:在我看來這是不允許的。但是,它確實如此。 –

+0

你有沒有證據支持這一說法? –