C# 语言sin和cos函数的实现 -- 可以用于帧同步的sin查表算法
不多说了,直接贴代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using FP; namespace FP { class TrigonometricFunction { protected static int TAB_N = 256; //定义查表的点数 protected static FPoint PI = new FPoint(3.14159265f); //定义圆周率值 protected static List SIN_TAB = new List(); protected static TrigonometricFunction _Instance = null; protected static TrigonometricFunction Instance() { if (_Instance == null) { _Instance = new TrigonometricFunction(); } return _Instance; } protected TrigonometricFunction() { SIN_TAB.Add(0); SIN_TAB.Add(245); SIN_TAB.Add(491); SIN_TAB.Add(735); SIN_TAB.Add(980); SIN_TAB.Add(1224); SIN_TAB.Add(1467); SIN_TAB.Add(1710); SIN_TAB.Add(1951); SIN_TAB.Add(2191); SIN_TAB.Add(2430); SIN_TAB.Add(2667); SIN_TAB.Add(2903); SIN_TAB.Add(3137); SIN_TAB.Add(3369); SIN_TAB.Add(3599); SIN_TAB.Add(3827); SIN_TAB.Add(4052); SIN_TAB.Add(4276); SIN_TAB.Add(4496); SIN_TAB.Add(4714); SIN_TAB.Add(4929); SIN_TAB.Add(5141); SIN_TAB.Add(5350); SIN_TAB.Add(5556); SIN_TAB.Add(5758); SIN_TAB.Add(5957); SIN_TAB.Add(6152); SIN_TAB.Add(6344); SIN_TAB.Add(6532); SIN_TAB.Add(6716); SIN_TAB.Add(6895); SIN_TAB.Add(7071); SIN_TAB.Add(7242); SIN_TAB.Add(7410); SIN_TAB.Add(7572); SIN_TAB.Add(7730); SIN_TAB.Add(7883); SIN_TAB.Add(8032); SIN_TAB.Add(8176); SIN_TAB.Add(8315); SIN_TAB.Add(8449); SIN_TAB.Add(8577); SIN_TAB.Add(8701); SIN_TAB.Add(8819); SIN_TAB.Add(8932); SIN_TAB.Add(9040); SIN_TAB.Add(9142); SIN_TAB.Add(9239); SIN_TAB.Add(9330); SIN_TAB.Add(9415); SIN_TAB.Add(9495); SIN_TAB.Add(9569); SIN_TAB.Add(9638); SIN_TAB.Add(9700); SIN_TAB.Add(9757); SIN_TAB.Add(9808); SIN_TAB.Add(9853); SIN_TAB.Add(9892); SIN_TAB.Add(9925); SIN_TAB.Add(9952); SIN_TAB.Add(9973); SIN_TAB.Add(9988); SIN_TAB.Add(9997); SIN_TAB.Add(10000); } public static FPoint Sin(FPoint pi) { TrigonometricFunction fuc = TrigonometricFunction.Instance(); int n = 0; int a = 0; int TAB_N = TrigonometricFunction.TAB_N; List SIN_TAB = TrigonometricFunction.SIN_TAB; n = (pi * TAB_N / 2 / PI).ToInt(); // SIN_TAB[i] = sin(2*PI*i/TAB_N); if (n >= 0 && n <= TAB_N / 4) // 0 ~ PI/2 { a = SIN_TAB[n]; } else if (n > TAB_N / 4 && n < TAB_N / 2) // PI/2 ~ PI { n -= TAB_N / 4; a = SIN_TAB[TAB_N / 4 - n]; } else if (n >= TAB_N / 2 && n < 3 * TAB_N / 4) // PI ~ 3/4*PI { n -= TAB_N / 2; a = -SIN_TAB[n]; } else if (n >= 3 * TAB_N / 4 && n < TAB_N) // 3/4*PI ~ 2*PI { n = TAB_N - n; a = -SIN_TAB[n]; } FPoint ret = new FPoint(a); ret = ret * 0.0001f; return ret; } public static FPoint Cos(FPoint pi) { FPoint PI = TrigonometricFunction.PI; FPoint pi2 = pi + PI / 2; if (pi2 > 2 * PI) pi2 -= 2 * PI; FPoint a = TrigonometricFunction.Sin(pi2); return a; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)