簡體   English   中英

編譯器的不同結果:(gcc 4.8.1)和gcc(4.3.2)

[英]Different results for compilers: (gcc 4.8.1) and gcc( 4.3.2)

我通過在線法官針對C ++的不同編譯器提交了相同的問題解決方案。在gcc(4.3.2)上,我得到了WA,而在gcc(4.8.1)上提交時,相同的解決方案得到了TLE。

是4.3.2速度更快,但我認為性能明智的最新版本應優於以前的版本,還是兩個編譯器中的浮點異常,因為問題需要計算64位數字的nth根,並且我使用的是long double和long具有pow函數的長數據類型。我使用了類似的東西:

    long long root,n;
    long double rad,rcnd;
    root = (long long)pow(rad,rcnd); where rcnd = 1.0/n;

相同基本函數的兩個版本(例如pow()每個都需要精確到> 0.5ULP才能有時用相同的參數產生不同的結果。

C和C ++標准對pow()的准確性沒有任何限制。 適當的實現將嘗試精確到1ULP ,但這仍然留下答案不是最佳答案且與另一個1-ULP准確的pow()函數的答案不同的可能性。 實際上,此站點上的幾個問題是由pow()函數引起的,這些函數的准確性不超過1ULP ,但是盡管提供不准確的函數的方法繁多 ,但可能很丑陋。

因此,簡而言之:如果使用pow() ,則兩個編譯器之間的計算可能會有所不同,盡管這些編譯器具有相同的實現定義的特征(int的大小,字節序,...)。 如果在數值不穩定的計算中使用pow() ,則最終結果可能會有所不同。

可重現結果的通常解決方案是提供您自己的pow()函數。 但是,如果差異是由數值不穩定的計算引起的,則不能解決根本問題:現在可以重現的結果可能仍然沒有意義。

暫無
暫無

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

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