COS(X)=開方(1-的sin(x)^ 2)
我想測試它在我的簡單的程序,但我不明白我的錯在哪裏? 最終結果不正確。
#include <iostream>
#include <vector>
#include <cmath>
int main() {
std::vector<float> data;
constexpr float angleAdd = 360.0/10.0;
constexpr float M_PI_DIVIDED_BY_180 = M_PI/180.0;
for (auto angle = 0.0; angle < 360.0; angle += angleAdd) {
data.push_back(angle);
}
//
float res1 = 0;
for (int i = 0; i < data.size(); ++i) {
res1 += sin(data[i]*M_PI_DIVIDED_BY_180);
res1 += cos(data[i]*M_PI_DIVIDED_BY_180);
}
std::cout << "\n\n";
float res2 = 0;
for (int i = 0; i < data.size(); ++i) {
float angle = data[i];
float sinVal = sin(angle*M_PI_DIVIDED_BY_180);
bool isPositiveSign = (angle >= 0 && angle <= 90) || (angle >= 270 && angle <= 360);
float cosVal = sqrt(1 -sinVal*sinVal);
if (isPositiveSign) {
cosVal = fabs(cosVal);
} else {
cosVal = -1.0*fabs(cosVal);
}
res2 += sinVal;
res2 += cosVal;
}
std::cout << "res1: " << res1 << " res2: " << res2 << std::endl;
return 0;
}
它給我:
RES1:-6.89606e-07 RES2:-3.57628e-07
顯然,res2
是錯誤的。 我相信在我的cos符號的計算中有些東西被搞砸了,但我無法弄清楚 - 什麼。 社區能給我一些提示這裏有什麼問題嗎?
「顯然,res2是錯誤的」。爲什麼?你期望什麼價值? – interjay
這不是一個有效的測試,因爲舍入錯誤也有所貢獻。總和應該是零,所以你看到的是兩個不同的舍入誤差。兩者都具有預期的幅度,即接近'std :: numeric_limits :: epsilon()'。 –
Walter
'res1'和'res2'應該*近乎相等,不是嗎? – fres