我一直在試圖單元測試我爲大地測量變換編寫的一個C++
類。變量分組在優化代碼中提供不同的答案
我注意到三個變量的微小分組變化極大地影響了函數中的錯誤。
EDIT:下面是可編譯例如整個函數:
假設latitude
,longitude
和altitude
是零。 Earth::a = 6378137
和Earth::b = 6356752.3
我正在努力獲得基準數字,今天在工作中出現了一些問題,我不得不這樣做。
void Geodesy::Geocentric2EFG(double latitude, double longitude, double altitude, double *E, double *F, double *G) {
double a2 = pow<double>(Earth::a, 2);
double b2 = pow<double>(Earth::b, 2);
double radius = sqrt((a2 * b2)/(a2 * pow<double>(sin(latitude), 2) + b2 * pow<double>(cos(longitude), 2)));
radius += altitude;
*E = radius * (cos(latitude) * cos(longitude));
*F = radius * (cos(latitude) * sin(longitude));
*G = radius * sin(latitude);
return;
}
其中所有值被定義爲double
包括那些在Earth
。
template <typename T>
static inline T pow(const T &base, unsigned const exponent) {
return (exponent == 0) ? 1 : (base * pow(base, exponent - 1));
}
有問題的代碼:
*E = radius * cos(latitude) * cos(longitude);
*F = radius * cos(latitude) * sin(longitude);
產生不同的結果:該pow<T>()
函數是一個遞歸函數模板被定義
*E = radius * (cos(latitude) * cos(longitude));
*F = radius * (cos(latitude) * sin(longitude));
什麼是編譯器gcc
做與優化級別3
使這些結果1e-2
有什麼不同?
使用匯編程序,盧克。爲此嘗試gcc資源管理器。 (請注意,在這裏我沒有針對不同的版本獲得不同的彙編程序,但是ymmv) – PlasmaHH
編譯不帶優化時會得到不同的結果嗎?如果半徑與sin/cos範圍[-1,1]非常大相同,那麼期望得到不同的結果 – egur
讓我做一個基準,我會回到你們身上 –