Sin算法不起作用

时间:2018-04-18 20:46:50

标签: c++ math visual-c++ sin

我制作了一个c ++程序来计算没有math.h的罪。我在我的程序https://ibb.co/bTnQnS中使用此算法。我输入45度,程序将度数转换为弧度,程序使用算法,程序输出-0.868597。该程序应输出0.70710678或√2/ 2。我在算法上做错了什么?

代码:

    Try
        strFileSearch = Directory.GetFiles("C:\", "*.wav", SearchOption.AllDirectories)
    Catch ex As UnauthorizedAccessException
        MessageBox.Show("Unathorized Exception!")
    Catch ex As IOException
        MessageBox.Show("IOException!")
    Catch ex As PathTooLongException
        MessageBox.Show("Path To Long Exception!")
    End Try

1 个答案:

答案 0 :(得分:3)

你的泰勒系列扩展功能不正确。 :)

你必须忽视所有平等条款。

我已经为你修好了(我删除了一些特定于Windows的内容,因为我没有;有一台Windows机器:stdfax.h标题和pause的调用被删除了)

# include <cstdlib>
# include <iostream>

using namespace std;

double sin(int input, int decimal_count);
int factorial(int n);
double deg_to_rad(int deg);
double power(double base, int power);


int main(){
    double angle;
    int decimal;

    cout << "The sine value is: " << sin(45,8) << endl;

    //end
    system("sleep 2");
    return 0;
}

double sin(int input, int accuracy) {
    int odds = 3;
    double sin;
    double rads = deg_to_rad(input);
    bool negative_flag = true;
    cout << "You entered " << input << " degrees" << endl;
    cout << "This is " << rads << " radians" << endl;
    sin = rads;

    for (int taylor_term = 3; taylor_term <= 7; taylor_term += 2) {
        double term = (double)(power(rads, taylor_term) / factorial(taylor_term));
        if (negative_flag) {
            term = -1 * term;
        }
        negative_flag = !(negative_flag);
        sin += term;
    }
    return sin;
}



int factorial(int n) {
    int fact = 1;

    for (int j = 1; j <= n; j+=1) {
        fact = fact * j;
    }
    return fact;
}

运行此输出

You entered 45 degrees
This is 0.785398 radians
The sine value is: 0.707106

解释

泰勒的泰勒系列扩展是一系列术语,奇数泰勒系数在符号中交替出现。在我的代码中,交替的标志是由旗帜实现的。我也只考虑了泰勒系列扩展的前3个术语。

除此之外,行double term = (double)(power(rads, taylor_term) / factorial(taylor_term));计算泰勒系列扩展中的每个术语。

negative_flag = !(negative_flag);会重置下一个字词的标志。

解决您的评论以及您的代码有点错误

以下是你的罪恶功能,只需要很少的改动就能使它发挥作用。 你做错了什么

这些只是最少的编辑,执行这些编辑自然会跟进一些代码样式清理。例如:ifelse块(不是else if)几乎完全相同的代码

  1. sin在被修改之前没有被初始化
  2. 归因于更正if区块中的泰勒术语不正确的标志。
  3. 不需要在rads的末尾额外减去sin。修复这些问题后,您的代码就会起作用:)

    int odds = 3;
    double sin ;
    double rads = deg_to_rad(input);
    sin = rads;
    
    for (int i = 1; i <= accuracy; i += 1) {
    
    
        if (i==1) {
            sin = sin - power(rads, odds) / factorial(odds);
        }
        else if (i%2==0) {
            sin = (power(rads, odds) / factorial(odds)) + sin;
    
        }
        else {
            sin = -(power(rads, odds) / factorial(odds)) + sin;
    
        }
        odds = odds + 2;
    
    }
    return sin;