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项不正确,则属性为correctsin
中额外减去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;