正弦函数解析(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.rhkb.cn/news/498614.html

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

相关文章

阴阳师の新手如何速刷5个SP/SSR?!(急速育成)

目标&#xff1a;攒5个SP/SSR式神&#xff0c;参与急速育成&#xff0c;省四个黑蛋&#xff08;想要快速升级技能而且经常上场的式神在攒够5个式神前先不升级&#xff09;【理论上组成&#xff1a;10蓝40蓝预约召唤福利20修行or抽卡】 关键点&#xff1a;蓝票&#xff0c;新手…

Kerberos用户认证-数据安全-简单了解-230403

hadoop安全模式官方文档&#xff1a;https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。 概念&#…

第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述

前言 本文介绍了 ES 使用的网络模型&#xff0c;并介绍 transport&#xff0c;http 接收、响应请求的代码入口。 网络 IO 模型 Node 在初始化的时候&#xff0c;会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports&#xff0…

SQL 基础教程 - SQL SELECT 语句

SQL SELECT DISTINCT 语句 SELECT DISTINCT 语句用于返回唯一不同的值。 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

计算机网络基础知识(7)中科大郑铨老师笔记

协议层次及服务模型 计算机网络的分层设计方法&#xff0c;将复杂的网络功能分解为多个层次&#xff0c;每一层实现特定的功能。 互联网中的TCP/IP协议族&#xff0c;包括物理层、链 路层、网络层、传输层和应用层的功能。然后&#xff0c;数据传输的 过程&#xff0c;从应用层…

Microsoft word@【标题样式】应用不生效(主要表现为在导航窗格不显示)

背景 随笔。Microsoft word 2013基础使用&#xff0c;仅做参考和积累。 问题 Microsoft word 2013&#xff0c;对段落标题文字应用【标题样式】不生效&#xff08;主要表现为在导航窗格不显示&#xff09;。 图1 图2 观察图1和图2&#xff0c;发现图1的文字在应用【标题一】样…

TP 钱包插件版本的使用

目前 TokenPocket 的几个平台中&#xff0c;以 ios 和 安卓版本最为常见&#xff0c;其实很少有人知道&#xff0c;浏览器上有一个插件版本的 Tp, 用电脑多的话&#xff0c;这也是一个挺好的选择。 最新版本现在支持Chrome、Brave 浏览器、Edge&#xff08;Firefox及Opera正在…

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

&#x1f389;【小程序上线第三天&#xff01;突破25用户大关&#xff01;】&#x1f389; 嘿&#xff0c;大家好&#xff01;今天是我们小程序上线的第三天&#xff0c;我们的用户量已经突破了25个&#xff01;昨天还是16个&#xff0c;今天一觉醒来竟然有25个&#xff01;这涨…

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更&#xff0c;Google 引入了更严格的 PendingIntent 安全管理&#xff0c;强制要求开发者明确指定 PendingIntent 的可变性&#xff08;Mutable&#xff09;或不可变性&#xff08;Immutable&#xff09;。 但是&#xf…

打印进度条

文章目录 1.Python语言实现(1)黑白色(2)彩色&#xff1a;蓝色 2.C语言实现(1)黑白颜色(2)彩色版&#xff1a;红绿色 1.Python语言实现 (1)黑白色 import sys import timedef progress_bar(percentage, width50):"""打印进度条:param percentage: 当前进度百分比…

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

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

数据结构(哈希表)

背景 在对数据的日常处理中&#xff0c;查找是一项基本操作。通常&#xff0c;查找算法都是基于对比的&#xff0c;比如在一条链表中有n个节点&#xff0c;要找到其中的某个节点&#xff0c;最基本的思路就是从头到尾依次遍历每个节点&#xff0c;依次对比每个节点是否是想要的…

【每日学点鸿蒙知识】模拟器开启网络、长时任务、兼容性测试支持、丢帧定位、SO中访问rawfile等

1、模拟器如何开启网络&#xff1f; 模拟器使用的是电脑本身的网络&#xff0c;不通过代理即可访问网络。 2、创建子window后&#xff0c;锁屏很短时间内&#xff0c;应用会被杀死&#xff1f; 没开长时任务&#xff0c;锁屏和退后台保活要开长时任务。 应用退至后台后&…

如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory

Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4&#xff0c;CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题&#xff0c;编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …

Mac连接云服务器工具推荐

文章目录 前言步骤1. 下载2. 安装3. 常用插件安装4. 连接ssh测试5. 连接sftp测试注意&#xff1a;ssh和sftp的区别注意&#xff1a;不同文件传输的区别解决SSL自动退出 前言 Royal TSX是什么&#xff1a; Royal TSX 是一款跨平台的远程桌面和连接管理工具&#xff0c;专为 mac…

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…

从0到机器视觉工程师(一):机器视觉工业相机总结

目录 相机的作用 工业相机 工业相机的优点 工业相机的种类 工业相机知名品牌 光源与打光 打光方式 亮暗场照明 亮暗场照明的应用 亮暗场照明的区别 前向光漫射照明 背光照明 背光照明的原理 背光照明的应用 同轴光照明 同轴光照明的应用 总结 相机的作用 相机…

gesp(C++一级)(7)洛谷:B3863:[GESP202309 一级] 小明的幸运数

gesp(C一级)&#xff08;7&#xff09;洛谷&#xff1a;B3863&#xff1a;[GESP202309 一级] 小明的幸运数 题目描述 所有个位数为 k k k 的正整数&#xff0c;以及所有 k k k 的倍数&#xff0c;都被小明称为“ k k k 幸运数”。小明想知道正整数 L L L 和 R R R 之间&a…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

力扣-数据结构-8【算法学习day.79】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…