我是否错误地使用Xcode或错误地编写了该程序

Did I use Xcode incorrectly or I wrote the program incorrectly?

本文关键字:错误 程序 Xcode 是否      更新时间:2023-10-16

,所以我正在做一个有关正弦的问题。

它说sin x可以通过多项式x-(x^3/6) (x^5/120) - (x^7/5040)近似,它告诉我要输出两个近似sin值和通过cmath计算的罪价值。

输入为程度,我们必须首先将其转换为弧度,然后发现罪。

示例运行(只有45个是输入,其他我们的输出):

角度:45大约= 0.70710647cmath sin = 0.70710678

我试图为此编写代码。当我按下Command R时,尽管该程序说"构建成功",但没有任何事情发生。我是Xcode的新手,因此我不确定是否错误地使用了Xcode或错误地编写了该程序。谁能帮忙?

#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double approxSin(double angleDeg) {
    if (-180<angleDeg<180) return approxSin(angleDeg-(angleDeg*angleDeg*angleDeg)/6+(angleDeg*angleDeg*angleDeg*angleDeg*angleDeg)/120-(angleDeg*angleDeg*angleDeg*angleDeg*angleDeg*angleDeg*angleDeg)/5040);
}
int main(){
    float angleDeg;
    cin >> angleDeg;
    if (angleDeg>180) {
        while (angleDeg>180) {
            angleDeg = angleDeg-360;
        }
    } else if (angleDeg<-180) {
        while (angleDeg<-180) {
            angleDeg = angleDeg+360;
        }
    }
    cout << "approxSin = " << &approxSin << endl;
    cout << "cmath sin = " << setprecision(8) << sin(angleDeg);
    return 0;
}

我的代码

我的猜测关于您的问题:您运行程序,它耐心地等待您的输入。

cin >> angleDeg;

您的程序似乎停止了,而它正在等待您在IDE控制台窗口中提供一些输入。由于您没有写任何提示,因此没有输出可以告诉您它正在等待输入。

我建议您先添加一些输出以要求输入:

cout << "Please enter angle in degrees: ";
cin >> angleDeg;

当我按下命令 r时,尽管程序说"构建成功",但没有发生任何事情。

我猜想某个程序员的答案应该解决此问题,但是,如评论中所述,已发布的代码中存在更糟糕的问题,这可能取决于对应如何声明和在C 中调用功能的误解。。

考虑一下:

double approxSin(double angleDeg) {
    if (-180<angleDeg<180) return approxSin(/* Some unreadable expression */);
}

足以生成几个警告:

PROG.CC:7:22:警告:将常数180与"布尔"类型的表达进行比较的结果                       总是真实的[-wtautological-contant-of-of-of范围能力]    if(-180&ltangledeg&lt180)返回大约(Angledeg  - (...));        ~~~~~~~~~~~~~~^~~~PROG.CC:6:35:警告:通过此功能的所有路径都会自称为[-winfinite-recursion]double of coutsin(double angledeg){                                  ^

将关系运算符从左到右评估,因此编译器将像-180<angleDeg<180这样的表达式读取为(-180 < angleDeg) < 180-180 < angleDeg的结果是bool,它导致编译器关于该表达式蜜蜂的友好警告始终是正确的。

它可以写为-180 < angle && angle < 180,但是鉴于OP的分配,应针对Plus或减去PI测试角度。另外,替代分支也应写入。

第二个警告是关于该功能的递归呼声,这是没有任何其他路径的毫无意义的。我只能猜测OP误解了如何从函数返回值的值。

可以使用std::pow或应用Horner的方法以更可读的方式评估多项式本身。我稍后再说一个例子。

另一个大问题(镜头,某种程度上)在"呼叫"网站中,这根本不是呼叫:

cout << "approxSin = " << &approxSin << endl;

它最终打印了1,原因可以在此Q&amp; A:如何用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_bn"
              << "-----------------------------------------------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;
}