【学Rust写CAD】15 定点数实现(fixed.rs)

源代码

fixed.rs文件实现了一个定点数(Fixed Point)类型 Fixed,用于在整数运算中模拟小数运算。代码如下:

//小数位数
const FIXED_FRACTION_BITS: u32 = 16;
//用于 双线性插值(Bilinear Interpolation) 的计算,它决定了插值权重(weight)的精度位数。一般为4或8
const BILINEAR_INTERPOLATION_BITS: u32 = 4;#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct Fixed(i32);impl Fixed {pub const ONE: Fixed = Fixed(1 << FIXED_FRACTION_BITS);pub const HALF: Fixed = Fixed(1 << (FIXED_FRACTION_BITS-1));//FIXED_ONE/// 创建新的Fixed值pub fn new(value: i32) -> Self {Fixed(value)}/// 将浮点数转换为定点数pub fn from_float(x: f32) -> Self {Fixed(((x * (1 << FIXED_FRACTION_BITS) as f32) + 0.5) as i32)}/// 将定点数转换为整数(截断小数部分)pub fn to_int(self) -> i32 {self.0 >> FIXED_FRACTION_BITS}/// 获取双线性插值权重pub fn bilinear_weight(self) -> u32 {// 丢弃不需要的精度位let reduced = self.0 >> (FIXED_FRACTION_BITS - BILINEAR_INTERPOLATION_BITS);// 提取剩余的小数部分let fraction = reduced & ((1 << BILINEAR_INTERPOLATION_BITS) - 1);fraction as u32}/// 获取内部值pub fn raw_value(self) -> i32 {self.0}
}// 实现一些运算符重载以便更方便地使用
impl std::ops::Add for Fixed {type Output = Self;fn add(self, rhs: Self) -> Self {Fixed(self.0 + rhs.0)}
}impl std::ops::Sub for Fixed {type Output = Self;fn sub(self, rhs: Self) -> Self {Fixed(self.0 - rhs.0)}
}impl std::ops::Mul for Fixed {type Output = Self;fn mul(self, rhs: Self) -> Self {// 定点数乘法需要调整小数位Fixed((self.0 as i64 * rhs.0 as i64 >> FIXED_FRACTION_BITS) as i32)}
}impl std::ops::Div for Fixed {type Output = Self;fn div(self, rhs: Self) -> Self {// 定点数除法需要调整小数位Fixed(((self.0 as i64 << FIXED_FRACTION_BITS) / rhs.0 as i64) as i32)}
}impl std::ops::Shr<u32> for Fixed {type Output = Self;fn shr(self, rhs: u32) -> Self {Fixed(self.0 >> rhs)}
}impl std::ops::Shl<u32> for Fixed {type Output = Self;fn shl(self, rhs: u32) -> Self {Fixed(self.0 << rhs)}
}

代码解析:

常量定义
  1. FIXED_FRACTION_BITS: u32 = 16:
  • 表示小数部分占用的位数

  • 使用16位表示小数部分,意味着有16位小数和16位整数(在i32中)

  1. BILINEAR_INTERPOLATION_BITS: u32 = 4:
  • 用于双线性插值计算的精度位数

  • 通常设置为4或8位,决定了插值权重的精度

Fixed 结构体

Fixed 是一个包装了 i32 的新类型,用于表示定点数。

重要常量
  1. ONE: 表示定点数1.0,值为 1 << 16 (65536)

  2. HALF: 表示定点数0.5,值为 1 << 15 (32768)

主要方法
  1. new(value: i32): 直接从一个i32值创建Fixed数

  2. from_float(x: f32): 将浮点数转换为定点数

  • 公式:x * (1 << 16) + 0.5 (0.5用于四舍五入)
  1. to_int(): 将定点数转换为整数(截断小数部分)
  • 右移16位丢弃小数部分
  1. bilinear_weight(): 获取双线性插值权重
  • 先丢弃不需要的精度位(保留BILINEAR_INTERPOLATION_BITS位)

  • 然后提取剩余的小数部分作为权重

  1. raw_value(): 获取内部存储的原始i32值
运算符重载

实现了基本的算术运算,注意乘法和除法的特殊处理:

  1. 乘法:
  • 需要先将操作数扩展为i64防止溢出

  • 结果右移16位调整小数位

  1. 除法:
  • 被除数左移16位扩展

  • 然后进行除法运算

定点数表示原理

这个实现使用Q16.16格式的定点数:

  • 32位整数(i32)中,高16位表示整数部分,低16位表示小数部分

  • 例如:0x00010000 表示1.0 (1 << 16)

  • 例如:0x00008000 表示0.5 (1 << 15)

应用场景

这种定点数实现常用于:

  1. 需要高性能小数运算但不想用浮点数的场合

  2. 图形处理中的坐标计算

  3. 嵌入式系统等不支持浮点运算硬件的环境

  4. 双线性插值等需要精确控制精度的算法

双线性插值中使用时,bilinear_weight()方法提供了权重计算,通过控制BILINEAR_INTERPOLATION_BITS可以调整插值精度。

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

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

相关文章

Linux输入系统应用编程

什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面&#xff0c;它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层&#xff1a;直接与硬件交互的驱动程序 输入核心层&#xff1a;内核中的输入子…

【C++初阶】---类和对象(下)

1.再探构造函数&#xff08;初始化链表&#xff09; •之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗…

Ubuntu 22.04.5 LTS 设置时间同步 ntp

提示&#xff1a;文章为操作记录&#xff0c;以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步&#xff0c;环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…

计算机网络——传输层(TCP)

传输层 在计算机网络中&#xff0c;传输层是将数据向上向下传输的一个重要的层面&#xff0c;其中传输层中有两个协议&#xff0c;TCP&#xff0c;UDP 这两个协议。 TCP 话不多说&#xff0c;我们直接来看协议报头。 源/目的端口号&#xff1a;表示数据从哪个进程来&#xff0…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

智慧电力:点亮未来能源世界的钥匙

在科技日新月异的今天&#xff0c;电力行业正经历着前所未有的变革。智慧电力&#xff0c;作为这一变革的核心驱动力&#xff0c;正逐步改变着我们对电力的认知和使用方式。它不仅是电力行业的一次技术革新&#xff0c;更是推动社会可持续发展、实现能源高效利用的重要途径。 智…

oracle中java类的使用

方式一&#xff1a; 编写一个简单的java类 vi OracleJavaDemo.java public class OracleJavaDemo { public static String processData(String input) { return "Processed: " input; } } 编译 javac OracleJavaDemo.java 生成OracleJavaDemo…

pycharm2024.1.1版本_jihuo

目录 前置&#xff1a; 步骤&#xff1a; step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置&#xff1a; 之…

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…

AWE 2025:当AI科技遇见智能家居

3月20日&#xff0c;以“AI科技、AI生活”为主题的AWE2025&#xff08;中国家电及消费电子博览会&#xff09;在上海新国际博览中心开幕。作为全球家电行业风向标&#xff0c;本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化&#xff0c;从衣物清…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理&#xff0c;结合生产级实践经验优化 实验环境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

蓝桥杯[每日一题] 真题:管道(java版)

题目描述 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的&#xff0c;位于 Li 的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位于 Li 的阀门&a…

2.pycharm部署Ai - 编程好助手

一、pycharm安装continue插件 1.提前安装好pycharm&#xff0c;并双击打开 2.File – Setting 3.Plugins – 搜索Continue &#xff0c; 点击Install安装 4.点ok 二、获取硅基流动API 1.登入网站&#xff1a;https://siliconflow.cn/zh-cn/#/&#xff0c;并注册登入 2.获取AP…

《数据结构:单链表》

“希望就像星星&#xff0c;或许光芒微弱&#xff0c;但永不熄灭。” 博主的个人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构&#xff0c;数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…

Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法

在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦&#xff0c;主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法&#xff0c;供参考&#xff1a; 搭建VS Qt 环境&#xff0c;在Visual Studios 2019下面安装 Qt Vis…

基于Spring Boot的网上商城系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

如何监控和优化服务器的 CPU 性能

一、实时监控与诊断工具 1. 核心监控工具 bash 复制 # 实时CPU使用率监控 top -H -p <PID> # 按线程查看CPU占用 htop --sort-keyPERCENT_CPU # 可视化进程CPU排序 mpstat -P ALL 1 # 每核心使用率统计 2. 上下文切换分析 bash 复制 pidstat -w…

【蓝桥杯14天冲刺课题单】Day 1

1. 题目链接&#xff1a;19937 艺术与篮球 该题目的难点主要在20240413这个日期需要结束程序跳出循环。最开始将该输出ans的位置放在了for循环之外&#xff0c;此时的日期已经循环完了2024年所有的日期&#xff0c;则最后会统计多而导致结果错误。 AC代码&#xff1a; #incl…

Masked Attention 在 LLM 训练中的作用与原理

在大语言模型&#xff08;LLM&#xff09;训练过程中&#xff0c;Masked Attention&#xff08;掩码注意力&#xff09; 是一个关键机制&#xff0c;它决定了 模型如何在训练时只利用过去的信息&#xff0c;而不会看到未来的 token。这篇文章将帮助你理解 Masked Attention 的作…