c++作业题sin公式
今日 有一位同样读大一的朋友向我求助有关c++的作业题 他说他的程序逻辑正确 但是结果的精度不对
题目如下:

这是一道看起来十分简单的作业题 我按照要求快速地写了一个版本 不出所料 一样遇到了精度问题
为什么会出现这种问题?
首先 计算机中的浮点数是不够精确的 这是为了运算速度所做的牺牲
在我写的代码中 使用的是double 为了使结果精确 要能尽量减少不必要的计算过程
而我用了cmath头文件中的pow函数 这使得double会被计算很多次导致结果精度降低
于是我决定写一个无pow版本 从公式出发 思路如下:
原式化简:
sin(x) = x/1! - x^3/(1!*2*3) + x^5/(3!*4*5) - x^7/(5!*6*7) ...
拆分:
sin(x)= x/1!
- x^3/(1!*2*3)
+ x^5/(3!*4*5)
- x^7/(5!*6*7)
...
拆分之后我们可以尝试用一个变量去替换其中的数字:
sin(x)= x/1!
[i=1] - x^3/(i!*(i+1)*(i+2))
[i=3] + x^5/(i!*(i+1)*(i+2))
[i=5] - x^7/(i!*(i+1)*(i+2))
[i=n] ...
引入一个变量p 替换幂:
p=x
sin(x)= p/1!
[i=1,p=p*x*x] - p/(i!*(i+1)*(i+2))
[i=3,p=p*x*x] + p/(i!*(i+1)*(i+2))
[i=5,p=p*x*x] - p/(i!*(i+1)*(i+2))
[i=n,p=p*x*x] ...
再引入一个变量f 替换阶乘:
f=1
p=x
sin(x)= p/f
[i=1,p=p*x*x,f=f*(i+1)*(i+2)] - p/f
[i=3,p=p*x*x,f=f*(i+1)*(i+2)] + p/f
[i=5,p=p*x*x,f=f*(i+1)*(i+2)] - p/f
[i=n,p=p*x*x,f=f*(i+1)*(i+2)] ...
再引入一个变量n 替换其中的负号:
n=1
f=1
p=x
sin(x)= p/f
[i=1,p=p*x*x,f=f*(i+1)*(i+2),n=-n] + n*p/f
[i=3,p=p*x*x,f=f*(i+1)*(i+2),n=-n] + n*p/f
[i=5,p=p*x*x,f=f*(i+1)*(i+2),n=-n] + n*p/f
[i=n,p=p*x*x,f=f*(i+1)*(i+2),n=-n] ...
现在每项的式子完全相同了 只需将其转换成对应的程序
我们要考虑结束条件 即当其中一项的绝对值小于1.0e-7时 结束这个循环
最终答案 :
double x;
cout << "请输入角度值:";
cin >> x; x = x * 3.141592654 / ; double n = ;
double f = ;
double p = x;
double i = -; double term = ;
double result = p / f; while ()
{
i += ;
p = p * x * x;
f = f * (i + ) * (i + );
n = -n;
term = p / f;
if (term < 1.0e-7)
break;
result = result + n * term;
}
cout << "对应的sin值为:" << result << endl;
结果正确:
再看看朋友的代码:
double angel,term,sum=,i=,multi=,sign=-;
const double pi=3.141592654;
cout<<"请输入角度值:";
cin>>angel;
angel=angel*pi/;
term=angel;
while(term>=1.0e-7||term<=-1.0e-7)
{
sum+=term;
angel*=angel*angel;
multi*=(i+)*(i+);
term=sign*angel/multi;
sign*=-;
i+=;
}
cout<<"对应的sin值为:"<<sum<<endl;
结果:

思路大致和我相同 但是其中一步 angel*=angel*angel; 不对
在我的代码中 这一步对应的是 p = p * x * x; 其中x是不变的 他代码的这一部分并不等效于sin公式
END
c++作业题sin公式的更多相关文章
- 1137 - Sin your life sin公式 + 枚举
http://www.ifrog.cc/acm/problem/1137 和差化积公式, 变成2 * sin((x + y) / 2) * cos((x - y) / 2) + sin(n - (x ...
- java web 运动前端
[写在前面的话:]前不久刚看到过一句话:说好的技术文章应该让读者感觉增加信心,而不是失去信心.有感于这句话是因为以前觉得发一些貌似高深的,看起来nb的东西才算一篇好博文,可是多少有点炫技的成分.可是后 ...
- sin n次方 x 的降幂公式
A(n) = ∫ sinⁿx dx= ∫ sinⁿ⁻¹xsinx dx= - ∫ sinⁿ⁻¹x d(cosx)= - sinⁿ⁻¹xcosx + ∫ cosx • d(sinⁿ⁻¹)= - sinⁿ ...
- 正割、余割、正弦、余弦、正切、余切之间的关系的公式 sec、csc与sin、cos、tan、cot之间的各种公式
1.倒数关系 tanα ·cotα=1 sinα ·cscα=1 cosα ·secα=1 2.商数关系 tanα=sinα/cosα cotα=cosα/sinα 3.平方关系 sinα²+cosα ...
- “玲珑杯”线上赛 Round #17 河南专场 A: Sin your life(和化积公式)
传送门 题意 略 分析 首先将sin(x)+sin(y)+sin(z)h转化成\(2*sin(\frac{x+y}2)*cos(\frac{x-y}2)+sin(z)\),而cos(z)=cos(-z ...
- Tween公式 以及四个参数
Tween的主页在这里:http://createjs.com/tweenjs , 这里边还有挺多开源项目的: Tween公式 4个参数 t:current time(当前时间) b:beginnin ...
- UVA 11817 Tunnelling the Earth --球面距离公式
题意: 给出两点的经纬度,求两点的球面距离与直线距离之差. 解法: 我们先算出球面距离,然后可以根据球面距离算出直线距离. 球面距离公式: R*acos(sin(W1)*sin(W2)+cos(W1) ...
- LaTex学习笔记——LaTeX公式换行
ps. 1.“\!” 表示其前后字符之间无间隙 2.暂留 3.段落中的数学表达式应该置于( 和), $ 和$ 或者begin{math} 和end{math} 之间. ...
- [家里蹲大学数学杂志]第237期Euler公式的美
1 Euler 公式 $e^{i\pi}+1=0$ (1) 它把 a. $e:$ 自然对数的底 $\approx 2. 718281828459$ (数分) b. $i$: 虚数单位 $=\sqr ...
随机推荐
- 初阶sql注入总结
0x00 前言 sql注入是通过用户输入构造语句以实现目的.一句话,不要相信任何用户输入的内容,做好防护. 0x01 传参方式 传参方式一般通过get方式,或者post方式提交,前者的优点是效率高,后 ...
- 项目中 直接跳后台 不用输入/newadmin
- JavaScript正则表达式进阶指南
摘要:正则表达式是程序员的必备技能,想不想多学几招呢? 本文用JavaScript的exec方法来测试正则表达式. 例如,正则表达式**/F.*g/会匹配"以F开头,以g结尾的字符串&quo ...
- Python基础(二)--基本数据类型、格式化输出、基本运算符
一.基本数据类型 1.数字类型 #int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary ...
- rz上传文件乱码
问题 使用rz上传文件时,出现乱码,上传失败. 原因 文件中包含控制字符 解决方法 使用 rz -be -b:–binary 用binary的方式上传下载,不解释字符为ascii: -e:–esca ...
- 对NetBackup 问题进行故障排除的步骤
错误消息通常是指出哪里出现故障的手段.如果在界面上没有看到错误消息,但仍怀疑有问题,请检查报告和日志. NetBackup提供了各种报告和日志记录工具, 这些工具可提供错误消息,直接为您指出解决方案. ...
- Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition (ST-GCN)
Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition 摘要 动态人体骨架模型带有进行动 ...
- 从零开始写Hystrix
1.springboot+自定义注解实现灵活的切面配置 利用aop我们可以实现业务代码与系统级服务例如日志记录.事务及安全相关业务的解耦,使我们的业务代码更加干净整洁. 首先创建一个springboo ...
- flask-restful在解析的请求一定要传content-type:application/json吗?答:其实不需要!
在处理flask-restful api请求时,因为postman发送的格式为text,没有携带content-type:application/json,在解析参数的时候,参数的值都给搞成了空,导致 ...
- discuz开发实现自动获取后台入口代码
一般discuz后台入口默认是admin.php,不过部分用户为了安全可能会修改后台入口文件名称,可以用代码 '.ADMINSCRIPT.'?frame=no&action=tools& ...