簡體   English   中英

為什么在32位和64位OS上為任何CPU生成Visual Studio都會產生不同的浮點結果?

[英]Why does Visual Studio build for Any CPU gives different floating point results on 32bit and 64bit OS?

我編寫了一個C#應用程序,該應用程序執行復雜的計算(測量值的最小二乘平差)。 我使用Visual Studio中的任何CPU配置構建了此應用程序。 一切運行良好,直到我收到一封電子郵件,指出在一種特定情況下,兩台不同的PC上的結果有所不同。 經過一些調試后,我發現與64位操作系統相比,在32位OS上運行的應用的結果略有錯誤(小數點后12位)。 在那種特定情況下,最終結果差強人意,因為它表明錯誤的測量沒有通過測試。

然后,我構建了該應用程序的2個版本(32位和64位),這兩個版本均按預期工作,並給出了相同的結果。

因此,現在我想了解“引擎蓋”下發生的情況,任何CPU版本如何執行與32位和64位版本不同的浮點計算? 優化代碼選項一直處於關閉狀態。

我的第一個帖子在這里。 我認為我必須向所有對此事感興趣的人展示一些與zoran發布的內容完全相關的東西。

簡單地,寫下以下代碼:

float a = -0.003124237f;
float b =  0.009375687f;
float c = 88.4625f;
float abc = a + b + c;
float cab = c + a + b;

然后進行2個測試,使用x86和x64構建。在這兩個測試中,請注意“ abc”和“ cab”是否看到了什么? 好吧,我願意。 必須將其命名為“ bug”。 這不是程序錯誤,而是我猜想它深深地屬於CPU的錯誤。 真正了解的人可以幫助我們進一步了解此問題。 在此先感謝,並感謝zoran在這里發布了類似的文章。

(對於那些忙於測試我的“代碼”的人,這里是我的結果:

x86:abc = cab = 88.46875

x64:abc = 88.46875,但是..... cab = 88.46876

換句話說,x64不能像x86生成器那樣精確地計算。 “精確”一詞非常“柔和”和“柔和”。 我庄嚴地稱這個“真正的錯誤”,這只是一個無法接受的問題。 確實。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM