[英]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.