[原创]正弦和反正弦函数

记得曾经有人提出过这个问题——如何模拟正弦函数。

我试着编了一个正弦和反正弦的函数。

算法:二分搜索,有些像搜索算法里的二分法,算试一种推广吧,我在单位圆里面对单位圆上的 坐标进行二分搜索,直到找到匹配的坐标为止;

——经过测试,和标准数学函数的正弦函数误差 几乎为0,

由于水平有限,让大家见笑了。

下面贴出代码(有注释,如果不懂,请提出来):

/*正弦和反正弦函数*/

/*为了和标准数学函数区别,正弦函数为sinof()反正弦函数为arcsin()*/

#include

typedef struct num{double x;double y;}num;

num *midof(num *a,num *b) /*求角平分线于单位圆的交点*/

{double x1,y1,z; num *mid=(num*)malloc(sizeof(num));

x1=(a->x+b->x)/2;

y1=(a->y+b->y)/2;

z=sqrt(100000000/(x1*x1+y1*y1));

mid->x=z*x1;

mid->y=z*y1;

return mid;}

double doarcsin(double n) /*搜索函数,可以搜索0-1*/

{num *a=(num*)malloc(sizeof(num)); /*a为上界,b为下界,mid为中间坐标*/

num *b=(num*)malloc(sizeof(num));

num *mid=(num*)malloc(sizeof(num));

double f,t,answer,s,i=45;

a->x=0;a->y=10000;

answer=90; /*尽量让坐标数值大,充分利用double的整数位,保证精确搜索*/

b->x=10000;b->y=0;

t=10000*n;f=sqrt(100000000-t*t);

mid=midof(a,b);

s=(mid->x-f)*(mid->x-f)+(mid->y-t)*(mid->y-t);

/*当sin 值达于0.6时以横坐标为判断*/

if(n>=0.6){while(s>=0.0000000001)

{

if(mid->x>f){b->x=mid->x;b->y=mid->y;i=i/2;}

if(mid->x<=f){a->x=mid->x;a->y=mid->y;answer=answer-i;i=i/2;}

mid=midof(a,b);

s=sqrt((mid->x-f)*(mid->x-f)+(mid->y-t)*(mid->y-t)); } }

else {while(s>=0.0000000001)

{ /*以纵坐标判断*/

if(mid->yx=mid->x;b->y=mid->y;i=i/2;}

if(mid->y>=t){a->x=mid->x;a->y=mid->y;answer=answer-i;i=i/2;}

mid=midof(a,b);

s=sqrt((mid->x-f)*(mid->x-f)+(mid->y-t)*(mid->y-t)); }}

free(a);

free(b);

free(mid);

return answer; }

double arcsin(double n) /*反正弦函数,把所有情况化为0-1的情况然后求解*/

{if(n>1||n

else if(n>=0)return (doarcsin(n));

else return (-1*doarcsin((-1*n))) ;}

double dosinof(double n) /*正弦搜索函数,计算0-90度的正弦值*/

{num *a=(num*)malloc(sizeof(num)); /*a为上界,b为下界,mid为中间坐标*/

num *b=(num*)malloc(sizeof(num));

num *mid=(num*)malloc(sizeof(num));

double answer,s,now=45000000,i=45000000; /*把角度扩大了1000000倍,充分利用double的整数位置,也是搜索准确的关键所在*/

n=n*1000000;

a->x=0;a->y=10000;

answer=90;

b->x=10000;b->y=0;

mid=midof(a,b);

s=abs(i-n);

i=(i/2);

while(s>=0.0000000001)

{

if(now>n){a->x=mid->x;a->y=mid->y;now=now-i;i=(i/2); }

else if(now<=n){b->x=mid->x;b->y=mid->y;now=now+i;i=(i/2);}

mid=midof(a,b);

s=abs(now-n); }

answer=mid->y/10000;

free(a);

free(b);

free(mid);

return answer;}

double sinof(double n) /*正弦函数,把所有情况化归到0-90度然后解决*/

{while(n>180||n

{if(n>180)n=n-360;

if(n

if(n>90)n=180-n;

if(n

if(n>=0)return dosinof(n);

else return (-1*dosinof((-1)*n));}

c语言表示反正弦函数,[原创]正弦和反正弦函数相关推荐

  1. 用matlab计算反正弦函数,为什么正弦,反正弦函数计算结果会出现复数?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 All_1=62.9582, lAdot_radS=(180/186)/180*pi; onedeg = pi/180; RAAN = onedeg:on ...

  2. c语言中的反余弦和反正弦函数,VB中的反正弦函数与反余弦函数

    VB中好像没有反正弦函数与反余弦函数,需要自己动手编写,可以通过VB自带的反正切函数Atn(x)来编写VB的反正弦函数ArcSin(x)与反余弦函数ArcCos(x). VB自带的反正切函数: Atn ...

  3. 复数正弦波 matlab,为什么正弦,反正弦函数计算结果会出现复数?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 All_1=62.9582, lAdot_radS=(180/186)/180*pi; onedeg = pi/180; RAAN = onedeg:on ...

  4. c语言 开发交易系统,原创轻松编程(MT4平台智能交易系统图文教程)课件.pptx...

    原创轻松编程(MT4平台智能交易系统图文教程)课件 编程入门MT4平台智能交易系统图文教程本PPT采用Office2007编制开始之前请回答我的问题第一个问题 你真的下决心学习编程了吗?第二个问题 你 ...

  5. 哈夫曼字符串编码c语言实现,基于哈夫曼(haffuman)算法的文件压缩的实现(C语言)(原创)...

    本文首先简要阐述哈夫曼算法的基本思想,然后介绍了使用哈夫曼算法进行文件压缩和解压缩的 处理步骤,最后给出了C语言实现的文件压缩和解压缩的源代码. 哈夫曼算法的主要思想是: ①首先遍历要处理的字符串,得 ...

  6. 有序二叉树c语言,二叉搜索树(BST)的实现(C语言)(原创)

    叉搜索树(Binary Search Tree)的一般形式如下图所示,每个节点中的元素大于它的左子树中的所有元素,小于它的右子树中的所有元素.对该图中的二叉树进行中序遍历得到一个从小到大排列的有序序列 ...

  7. c语言用库函数求正弦数,用C语言求正弦值?

    1.C语言中要编写sin函数,实质上要利用sin的泰勒公式,然后根据泰勒公式,将其中的每一项进行分解,最后用循环,累加计算出最终结果. 2.下面用for循环实现sin的算法,程序代码如下: #incl ...

  8. c语言程序设计mp4,[原创]Nisy编程教学视频C语言/C++语言MP4版

    2011年左右录制的视频,现在没有精力去做教学辅导,全部免费分享给大家. 水平有限,难免视频中会出现一些疏漏和错误,欢迎大家批评指正. 学习过程中有问题可以加入我们的球球群24083233,一起交流讨 ...

  9. 接鸡蛋小游戏【终极版】【C语言】【原创】

    还是以前写的没法出来      接鸡蛋当时有写终极版,但是只是放在下载资源中,没发到博客上 /* 头文件 */ # include <windows.h> # include <st ...

  10. asin c语言中 返回值范围_C语言asin()函数:求正弦值为 x 的弧度数

    函数名: asin 头文件: 函数原型: double asin(double x) 功 能: 求正弦值为 x 的弧度数 参数: double x    正弦值.x 的取值必须位于区间[-1, 1]中 ...

最新文章

  1. 安装mayavi和VTK库的血泪史
  2. Could not open a connection to your authentication agent
  3. Android 内存管理 amp;Memory Leak amp; OOM 分析
  4. g++ 安装python_mac编译安装faiss
  5. 『转载』|收藏|一张看懂AI知识体系
  6. ​Transformer升级之路:从Performer到线性Attention
  7. 【题解】Atcoder ARC#90 F-Number of Digits
  8. Machine Learning - Coursera week6 Evaluating a learning algorithm
  9. scratch 素材_scratch书籍免费领
  10. WebService之Axis2 (3):使用services.xml文件发布WebService
  11. 【】oracle当前用户下有什么表?
  12. IOS APP提交流程
  13. 土方计算软件FastTFT V15.1.0更新说明(支持AutoCAD2020平台)
  14. 斐波那契堆的java实现
  15. EDA技术与应用实验二(PowerShell实现)
  16. 视频教程-HTML5基础视频课程 - 实用的HTML教程-HTML5/CSS
  17. 如何在计算机管理设置开机密码,电脑怎么设置开机密码 开机密码设置步骤
  18. 爬虫实战—豆瓣250榜单的爬取
  19. lua 范例_lua的mqtt实例
  20. drill apache_Apache Spark与Apache Drill

热门文章

  1. 《SPSS统计分析与行业应用实战》之房地产业中的应用
  2. ROS Noetic KDL与TracIk安装
  3. ZZNU 1992: 情人节的尴尬
  4. 12C GDS安装简记
  5. O2OA的流程管理详情
  6. python如何设置窗口为活动窗口
  7. PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  8. 计算机连接打印机连接打印机,怎么连接打印机.教您怎么连接打印机
  9. 微信小程序—火车票查询
  10. Python Django 添加首页尾页上一页下一页代码实例