正弦函数解析(sin.rs)

sin.rs文件提供了sin函数的实现,它计算并返回一个浮点数(f64类型)的正弦值。这个函数首先处理了一些特殊情况,如极小的值、无穷大和NaN(非数字),然后使用rem_pio2函数将输入参数x归约到[-π/2, π/2]的范围内,并根据归约的结果和n的值(n是x除以π/2的商的整数部分,对4取模的结果),选择调用k_sin或k_cos函数来计算最终的正弦值。

一、代码中关键部分的解释

1. 特殊值处理

  • 如果x的绝对值非常小(小于2^-26),函数会直接返回x,因为在这个范围内,sin(x)的值非常接近x。
  • 如果x是无穷大或NaN,函数会返回NaN。

2. 参数归约

使用rem_pio2函数将x归约到[-π/2, π/2]范围内,并返回三个值:n(x除以π/2的商的整数部分),y0(x的归约值的主要部分),和y1(x的归约值的次要部分,用于提高精度)。

3. 选择正确的函数来计算正弦值

根据n的值(对4取模),选择调用k_sin或k_cos函数,并可能取反。这是因为正弦和余弦函数在[-π/2, π/2]范围内是对称的,并且可以通过旋转坐标系来相互转换。

4. 测试

提供了一个测试函数test_near_pi,它测试了当x接近π时的正弦值计算是否正确。注意,由于浮点数的表示误差,测试值可能不是精确的π,而是一个接近π的浮点数。

5. force_eval!宏:

这个宏在代码中用于确保某些表达式被评估,即使编译器可能认为它们对最终结果没有影响。如浮点数的精度限制、下溢等。这在处理极小值或强制触发浮点异常时特别有用。但是它是不安全的,会因为特定硬件产生错误,不建议使用。代码如下:

macro_rules! force_eval {($e:expr) => {unsafe { ::core::ptr::read_volatile(&$e) }};
}

6. 位操作和浮点表示:

代码使用了位操作来提取浮点数的指数和尾数部分,以及通过特定的位模式来构造特定的浮点数(如x1p120,它表示2^120)。
请注意,k_sin和k_cos函数以及rem_pio2函数的具体实现在这段代码中没有给出。这些函数是计算正弦和余弦值的核心,rem_pio2函数负责将输入参数归约到基本区间内。
此外,#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]属性是一个条件编译属性,它在启用了测试和assert_no_panic特性时,确保sin函数不会引发恐慌(panic)。这对于编写健壮的库函数非常重要,因为它们不应该在正常情况下崩溃。

二、源代码

use super::{k_cos, k_sin, rem_pio2};// sin(x)
// 返回x的正弦函数。
//
// 核心函数:
//      k_sin            ... [-pi/4,pi/4]上的正弦函数
//      k_cos            ... [-pi/4,pi/4]上的余弦函数
//      rem_pio2         ... argument reduction routine
//
// 方法。
//设S、C分别表示[-PI/4、+PI/4]上的sin、cos。在[-pi/4,+pi/4]中,将参数x减小到y1+y2=x-k*pi/2,并设n=k mod 4。
//我们有
//
//          n        sin(x)      cos(x)
//     --------------------------------
//          0          S           C   
//          1          C          -S   
//          2         -S          -C   
//          3         -C           S   
//     --------------------------------
//
//特殊情况:
//设trig为“sin”或“cos”中的任何一个。
//trig(+-INF)是NaN,带有信号;
//trig(NaN)是NaN;//准确度:
//TRIG(x)返回几乎四舍五入的TRIG(x)/// x的正弦(f64)。(sine)
///
/// x单位是弧度。
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
pub fn sin(x: f64) -> f64 {let x1p120 = f64::from_bits(0x4770000000000000); // x1p120 == 2^120/* High word of x. */let ix = (f64::to_bits(x) >> 32) as u32 & 0x7fffffff;//去除符号位,即提取指数11位和尾数前20位/* |x| ~< pi/4 */if ix <= 0x3fe921fb {//等同于不超过后32位都是1的值(即0.7853984832763671),pi/4的值为0.785398163397448309615660845819875721_f64,会有略大于pi/4的数放进来。if ix < 0x3e500000 {// 2^-26,即1.4901161193847656e-8,考虑后32位可能都是1,即1.4901175404702368e-8/* |x| < 2**-26 *//* 如果x!=0,则提高不精确性0,如果低于正常值,则下溢*/if ix < 0x00100000 {//即非约数或0,force_eval!(x / x1p120);//制造一个下溢} else {force_eval!(x + x1p120);//小数加大数,结果小数被舍去,是否有报错信息就不清楚了}return x;//以上程序说明,|x|足够小时,即小于1.4901175404702368e-8时返回 x}return k_sin(x, 0.0, 0);//-45°至45°排除小值后调用该函数。}/* sin(无穷大 或 非数时返回非数 */if ix >= 0x7ff00000 {return x - x;//返回NaN值}/* 将输入参数归约到一个周期内的值来简化计算 */let (n, y0, y1) = rem_pio2(x);//调用归约函数match n & 3 {0 => k_sin(y0, y1, 1),1 => k_cos(y0, y1),2 => -k_sin(y0, y1, 1),_ => -k_cos(y0, y1),}
}#[test]
fn test_near_pi() {let x = f64::from_bits(0x400921fb000FD5DD); // 3.141592026217707let sx = f64::from_bits(0x3ea50d15ced1a4a2); // 6.273720864039205e-7let result = sin(x);#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]let result = force_eval!(result);assert_eq!(result, sx);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法&#xff0c;用于从信号中去除噪声。这种方法基于小波变换&#xff0c;它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤&#xff1a; &#xff08;1&#xff09;小波变换&#xff1a;首先对含噪信…

C语言 练习2

1.求10个整数中的最大值 //求10个整数中的最大值 int main() {//准备10个数//char arr[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//输入10个数char arr[10] { 0 };int i 0;for (i 0; i < 10; i){scanf("%d", &arr[i]);}//找出最大值int max arr[0];for (…

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug&#xff0c;操作体验与 VSCode 一致。 优势 执行效率高&#xff0c;不掉帧 可随时开启 配置简单&#xff0c;一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本&#xff08;注&#xff1a;从 Sublime 3 升到 4 的不算&#xff0c;…

光伏电站发电量提升秘籍

在如今这个倡导清洁能源的时代&#xff0c;光伏电站成为了不少人的选择。但怎样才能让自家的光伏电站发电量更高呢&#xff1f;下面就给大家分享几个实用方法。 一、光伏组件的选择与安装角度至关重要。优质的光伏组件转换效率更高&#xff0c;像单晶硅组件就比多晶硅组件在转…

flux文生图模型实践

flux文生图模型实践 flyfish https://github.com/black-forest-labs/flux Black Forest Labs发布FLUX.1 Tools&#xff0c;这是一套模型全家桶&#xff0c;旨在为FLUX.1基础文本转图像模型添加控制和可操纵性&#xff0c;从而实现对真实图像和生成图像的修改和重新创建。FLU…

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay

UCAS 24秋网络认证技术 CH15 Kerberos复习

Key Distribution Center-KDC 基本流程可分为两大部分&#xff1a;初始认证 和 服务票据获取与使用。 初始认证 Authenticate&#xff1a;客户端向认证服务器&#xff08;Authentication Server&#xff0c;AS&#xff09;发送请求以验证身份。Receive TGT&#xff1a;AS 验证…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

管理系统中经典审核功能实现

前言 先简单交代和阐述一下业务背景和逻辑&#xff0c;该系统是一个综合类的音乐系统&#xff0c;上传音乐时&#xff0c;逻辑和qq音乐一样&#xff0c;前端页面就能体现出大概逻辑&#xff0c;如下图所示&#xff1a; 专辑和歌曲是密不可分的&#xff0c;而且歌曲的封面就是对…

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…

惠州市政数局局长杨伟斌:惠州市公共数据授权运营模式探索

近期&#xff0c;2024数字资产管理大会召开。会上&#xff0c;惠州市政务服务和数据管理局局长杨伟斌在会上做了题为基于“隐私计算区块链”的惠州市公共数据授权运营模式探索主旨演讲&#xff0c;从三个方面展开&#xff0c;一是建制度汇数据&#xff0c;二是夯基础保安全&…

查看 GitHub 仓库的创建时间

查看 GitHub 仓库的创建时间 1. https://api.github.com/repos/{owner}/{repository}2. curl -s https://api.github.com/repos/{owner}/{repository} | jq .created_atReferences 1. https://api.github.com/repos/{owner}/{repository} REST API endpoints for repositories…

ArcGIS中怎么进行水文分析?(思路介绍)

最近有人咨询&#xff0c;ArcGIS中怎么进行水文分析&#xff0c;大致的说一下河网提取的思路哈 解决思路&#xff1a;dem填洼→计算水流方向→计算水流累积矩阵→形成河网 dem填洼 计算水流方向 计算水流累积矩阵 用栅格计算器&#xff0c;设阈值&#xff08;自己多次尝试&…

自动化测试-Pytest测试

目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest‌是一个非常流行的Python测试框架&#xff0c;它支持简单的单元测试和复杂的功能测试&#xff0c;具有易于上手、功…

2、redis的持久化

redis的持久化 在redist当中&#xff0c;高可用的技术包括持久化&#xff0c;主从复制&#xff0c;哨兵模式&#xff0c;集群。 持久化是最简单的高可用的方法&#xff0c;作用就是备份数据。即将数据保存到硬盘&#xff0c;防止进程退出导致数据丢失。 redis持久化方式&…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

深入解析:谱分解、SVD与PCA在算法中的应用与实现

特征值分解&#xff08;EVD&#xff09;、奇异值分解&#xff08;SVD&#xff09;和主成分分析&#xff08;PCA&#xff09;是矩阵分解技术的三种重要形式&#xff0c;它们在人工智能中扮演了关键角色。随着数据维度的快速增长和信息复杂度的提升&#xff0c;这些技术为处理高维…

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时&#xff0c;会提示您安装驱动程序。单击“是”确认安装&#xff0c;然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列&#xff08;iOS14.4及以上&#xff09;&#xff0c;您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…