Sin算法不起作用 我做了一个C++程序,不用数学就能计算罪恶。我在我的程序中使用这个算法。我输入45度,程序将度转换为弧度,程序使用算法,程序输出-0.868597。程序应输出0.70710678或√2/2. 我的算法出了什么问题

Sin算法不起作用 我做了一个C++程序,不用数学就能计算罪恶。我在我的程序中使用这个算法。我输入45度,程序将度转换为弧度,程序使用算法,程序输出-0.868597。程序应输出0.70710678或√2/2. 我的算法出了什么问题,c++,math,visual-c++,trigonometry,C++,Math,Visual C++,Trigonometry,代码: #include "stdafx.h" #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

代码:

#include "stdafx.h"
#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 << sin(45,8) << endl;

    //end
    system("pause");
    return 0;
}

double sin(int input, int accuracy) {
    int odds = 3;
    double sin;
    double rads = deg_to_rad(input);

    for (int i = 1; i <= accuracy; i += 1) {


        if (i==1) {
            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;

    }
    sin = sin - rads;
    return sin;
}



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

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



double deg_to_rad(int deg) {
    return deg*(3.14159265/180);
}


double power(double base, int power) {
    double ans = 1;

    for (int k = 1; k <= power; k+=1) {
        ans = ans * base;
    }

    return ans;
}
#包括“stdafx.h”
#包括
使用名称空间std;
双正弦(整数输入,整数十进制计数);
整数阶乘(intn);
双度至弧度(内度);
双电源(双基,整数电源);
int main(){
双角度;
整数十进制;

cout您的泰勒级数展开函数不正确。:)

你必须无视所有的公平条款

我已经为您修复了它(我删除了一些特定于windows的东西,因为我没有windows计算机:
stdfax.h
标题和对
pause
的调用已被删除)

解释 正弦的泰勒级数展开是一系列具有奇数泰勒系数的项,它们以符号交替。在我的代码中,交替符号受标志的影响。我还只考虑了泰勒级数展开的前3项

除此之外,行
double term=(double)(幂(rads,taylor_term)/阶乘(taylor_term));
计算泰勒级数展开中的每个项

negative_flag=!(negative_flag);
重置下一学期的标志符号

解决您的评论和代码有点错误的地方 下面是您的sin func,只需进行最小的更改即可使其正常工作。 你做错了什么

这些只是最小的编辑,执行这些编辑之后自然会进行一些代码风格的清理。例如:
if
else
块(而不是
else if
)的代码几乎完全相同

  • sin在被修改之前未被初始化
  • 如果
  • 块中的taylor项不正确,则属性为correct
  • 不需要从
    sin
    中额外减去
    rads
    。一旦这些问题得到解决,您的代码就可以工作:)

    int赔率=3;
    双重罪;
    双拉德=度到度拉德(输入);
    sin=rads;
    
    对于(int i=1;i您的泰勒级数展开函数不正确:)

    你必须无视所有的公平条款

    我已经为您修复了它(我删除了一些特定于windows的东西,因为我没有windows计算机:
    stdfax.h
    标题和对
    pause
    的调用已被删除)

    解释 正弦的泰勒级数展开是一系列具有奇数泰勒系数的项,它们以符号交替。在我的代码中,交替符号受标志的影响。我还只考虑了泰勒级数展开的前3项

    除此之外,行
    double term=(double)(幂(rads,taylor_term)/阶乘(taylor_term));
    计算泰勒级数展开中的每个项

    negative_flag=!(negative_flag);
    重置下一学期的标志符号

    解决您的评论和代码有点错误的地方 下面是您的sin func,只需进行最小的更改即可使其正常工作。 你做错了什么

    这些只是最小的编辑,执行这些编辑之后自然会进行一些代码风格的清理。例如:
    if
    else
    块(而不是
    else if
    )的代码几乎完全相同

  • sin在被修改之前未被初始化
  • 如果
  • 块中的taylor项不正确,则属性为correct
  • 不需要从
    sin
    中额外减去
    rads
    。一旦这些问题得到解决,您的代码就可以工作:)

    int赔率=3;
    双重罪;
    双拉德=度到度拉德(输入);
    sin=rads;
    

    对于(int i=1;i听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看程序偏离预期的地方。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:您是否使用泰勒级数来计算正弦?Yo您的代码看起来与您声称要实现的公式非常不同……您是否添加了
    x
    ?我的意思是sin(x)=x-x^3/3!…x在哪里?代码中不存在它。听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与预期的偏差。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:youu使用泰勒级数计算正弦?您的代码看起来与您声称要实现的公式非常不同……您是否添加了
    x
    ?我是说sin(x)=x-x^3/3!…x在哪里?它在代码中不存在。你根本不需要
    负标志。你只需要在
    1
    和-
    1
    之间切换,然后乘以该值。
    double multiplier=1.0;…对于(…){…sin+=term*multiplier;multiplier*=-1;}
    @Srini不是我的“赔率”变量跳过所有偶数?为什么我的函数不起作用?@PaulMcKenzie是的,看起来有点干净:)@Johanson151我编辑了我的答案,以便对你做错的地方提供更多解释:)@Srini非常感谢!你帮了大忙!你根本不需要
    负号。你只需要在
    1
    和-
    1
    之间切换并乘以该值。
    double multiplier=1.0;…对于(…){…sin+=term*multiplier;multiplier*=-1;}
    @Srini不是我的“赔率”变量跳过所有偶数?为什么我的函数不起作用?@PaulMcKenzie是的,看起来有点干净:)@Johanson151我编辑了我的答案,以便对你的错误做更多解释:)@Srini非常感谢!
    # 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
    
    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;