所以我在做一个有关正弦的C ++问题。
它说sin x可以通过多项式x-(x ^ 3/6)+(x ^ 5/120)-(x ^ 7/5040)近似,它告诉我输出两个近似的sin值和通过cmath计算的正弦值。
输入的单位是度,我们必须首先将其转换为弧度,然后找出正弦。
样本运行(输入只有45个,其他是我们的输出):
角度:45 大约Sin = 0.70710647 cmath sin = 0.70710678
我试图为此编写代码。当我按Command + R时,尽管程序说“ build success”,但什么也没发生。我是Xcode的新手,所以不确定我是否正确使用Xcode或编写错误程序。有人可以帮忙吗?
[err,result] = await to(db.query('insert into result(reg_no,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,essay1,essay2,essay3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)',[req.session.reg, req.body.q1.value, req.body.q2.value, req.body.q3, req.body.q4, req.body.q5, req.body.q6, req.body.q7, req.body.q8, req.body.q9, req.body.q10, req.body.essay1, req.body.essay2, req.body.essay3]));
答案 0 :(得分:1)
关于您的问题的我的 猜测 :您运行该程序,它耐心等待您的输入。
使用
cin >> angleDeg;
您的程序似乎正在停止,正在等待您在IDE控制台窗口中提供一些输入。由于您尚未编写任何提示,因此没有任何输出可告诉您它正在等待输入。
我建议您先添加一些输出以要求输入:
cout << "Please enter angle in degrees: ";
cin >> angleDeg;
答案 1 :(得分:0)
当我按Command + R时,尽管程序说“ build success”,但什么也没发生。
我猜answer的Some programmer dude应该可以解决此问题,但是,正如注释中所指出的那样,所发布的代码中存在更糟糕的问题,这可能是由于对函数应如何理解的误解所致。用C ++声明和调用。
考虑一下:
double approxSin(double angleDeg) {
if (-180<angleDeg<180) return approxSin(/* Some unreadable expression */);
}
足以产生一些警告:
prog.cc:7:22: warning: result of comparison of constant 180 with expression of type 'bool' is always true [-Wtautological-constant-out-of-range-compare] if (-180<angleDeg<180) return approxSin(angleDeg-(...)); ~~~~~~~~~~~~~^~~~ prog.cc:6:35: warning: all paths through this function will call itself [-Winfinite-recursion] double approxSin(double angleDeg) { ^
关系运算符从左到右进行求值,以便编译器将-180<angleDeg<180
之类的表达式读为(-180 < angleDeg) < 180
。 -180 < angleDeg
的结果是bool
,导致编译器对该表达式的警告始终为true。
可以将其写为-180 < angle && angle < 180
,但是在给定OP的分配后,应针对正负pi测试角度。另外,还应该编写替代分支。
第二个警告是关于函数的递归调用的,没有任何替代路径,这是没有意义的。我只能猜测OP误解了如何从函数返回值。
可以使用std::pow
或应用Horner方法以更具可读性的方式评估多项式本身。我将在后面显示一个示例。
另一个大问题(通常是某种程度上的问题)是在“通话”站点中,这根本不是通话:
cout << "approxSin = " << &approxSin << endl;
最终打印出1
,其原因可以在以下问答中找到:How to print function pointers with cout?
最后,我要注意的是,虽然作业特别要求将输入的角度从度转换为弧度(如std::sin
的参数所示),但发布的代码仅检查以度为单位的范围,而不进行任何转换
以下实现比较了评估sin()函数的不同方法
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <cmath>
namespace my {
// M_PI while widespread, isn't part of the ISO standard
#ifndef M_PI
constexpr double pi = 3.141592653589793115997963468544185161590576171875;
#else
constexpr double pi = M_PI;
#endif
constexpr double radians_from_degrees(double degrees)
{
return degrees * pi / 180.0;
}
constexpr double convert_angle_to_plus_minus_pi(double angle)
{
while ( angle < -pi )
angle += 2.0 * pi;
while ( angle > pi ) {
angle -= 2.0 * pi;
}
return angle;
}
// Approximates sin(angle), with angle between [-pi, pi], using a polynomial
// Evaluate the polynomial using Horner's method
constexpr double sin_a(double angle)
{
// A radian is passed, but the approximation is good only in [-pi, pi]
angle = convert_angle_to_plus_minus_pi(angle);
// Evaluates p(a) = a - a^3 / 6 + a^5 / 120 - a^7 / 5040
double sq_angle = angle * angle;
return angle * ( 1.0 + sq_angle * (-1.0/6.0 + sq_angle * ( 1.0/120.0 - sq_angle / 5040.0)));
}
double sin_b(double angle) {
angle = convert_angle_to_plus_minus_pi(angle);
return angle - pow(angle, 3) / 6.0 + pow(angle, 5) / 120.0 - pow(angle, 7) / 5040.0;
}
} // End of namespace 'my'
int main()
{
std::cout << " angle std::sin my::sin_a my::sin_b\n"
<< "-----------------------------------------------\n"
<< std::setprecision(8) << std::fixed;
for (int i = -90; i < 475; i += 15)
{
double angle = my::radians_from_degrees(i);
std::cout << std::setw(5) << i
<< std::setw(14) << std::sin(angle)
<< std::setw(14) << my::sin_a(angle)
<< std::setw(14) << my::sin_b(angle) << '\n';
}
return 0;
}