FixedPoint库:提升嵌入式C++定点数运算效率

5星 · 超过95%的资源 需积分: 50 16 下载量 76 浏览量 更新于2024-11-02 收藏 10KB ZIP 举报
资源摘要信息:"FixedPoint:C++ 中的定点算法库" 固定点算法在编程中是一种处理数字的方法,尤其在浮点运算受限的嵌入式系统中,固定点算法有其独特的优势。C++中的定点库提供了一种在程序中实现固定点运算的手段,该库通过两个头文件(.hpp)提供相应的功能。这种设计旨在提高定点运算的效率,特别是在没有浮点单元的嵌入式环境中。 定点数的使用通常需要程序员手动跟踪整数的哪一部分代表小数部分,哪一部分代表整数部分。例如,使用Q4.12格式表示定点数时,数字“1”实际上以4096的形式存储。在进行定点数之间的运算时,程序员需要特别注意小数点的位置,以防止运算结果出现逻辑错误。 FixedPoint库通过引入一个模板类型FixedPoint<m>,来解决上述问题。其中m代表小数点后保留的位数,这个模板类型能够以一种安全的方式来存储数字,而不会引入运行时开销。小数点位置仅在编译时与数字相关联,这意味着使用FixedPoint类型将带来以下好处: 1. 编译器可以捕获常见的错误,比如程序员在代码中声明了一个定点数类型,但赋值时没有按照指定的格式来进行。 2. FixedPoint类型可以自动处理不同格式的Q值之间的转换,例如,添加或比较不同Q格式的数字时,不需要程序员手动进行转换。 3. 这种类型的安全性在于,它不会让程序员轻易地在定点数和普通整数、浮点数之间进行不恰当的运算,从而减少了错误的发生。 在嵌入式系统中使用FixedPoint库可以提高运算效率,因为定点运算通常比浮点运算快,尤其是在硬件浮点支持不完善的情况下。然而,定点数的运算范围和精度都受到限制,因此在使用定点算法时,开发者需要根据具体应用的需求来选择合适的Q格式。 库中通常会包含一些示例(例如examples.hpp文件),通过阅读这些示例代码,开发者可以更容易地理解如何在自己的项目中使用FixedPoint库。示例通常会展示如何声明定点变量,如何进行基本的算术运算以及如何处理不同类型的FixedPoint数字。 库的设计者可能还考虑了其它一些高级特性,比如定点数的输入输出格式化,以及库的扩展性,以便用户可以根据自己的需求添加新的功能。 这个库的实现细节可能会涉及C++模板元编程技术,利用C++编译器的高级特性来在编译时期就解决小数点的位置问题,保证了效率的同时也保证了类型安全。 最后,固定点算法库的使用场景不仅限于嵌入式系统,它还可以在任何需要高效的定点运算的地方发挥作用,比如实时控制系统、数字信号处理等领域。对于C++开发者来说,掌握这样的库能够让他们更有效地解决实际问题,编写出性能更优的代码。
2017-04-08 上传
Algorithms   本次README修订为算法仓库Algorithms的第100次commit,首先我们庆祝自2016年8月4日本仓库建立以来Dev-XYS在算法学习方面取得的显著进步!   这里有各种算法的C++代码,任何人可以在自己的任何程序中使用,欢迎大家指出代码中的错误以及有待改进的地方。   本仓库内所有代码的授权方式为Unlicense,大家如果使用我的代码开发自己的软件挣了大钱,或是参考我的代码在NOI中得了金牌,我都会很高兴的。使用这里的代码之后,你可以自主选择是否公开源代码。总而言之,你可以把这里的代码当作你自己写的一样,无论怎样使用都是被允许的。但是,我不对本仓库内代码的正确性负责。大家要是使用我的代码开发软件而导致程序崩溃,或是参考我的代码在考试时出错,请不要向我抱怨。如果你愿意,遇到问题可以在Issues中提出来,我们共同解决。我们不赞成Pull Request,因为本仓库主要储存作者已经学习的算法,全部代码均由作者本人负责维护与更新。   以下索引提供了本仓库内算法的中文名,方便大家查找。更新可能有很长时间的延迟,不保证所有算法的名称都在列表中出现。 Index --------------------------Contents-------------------------- --------------------------FileName-------------------------- AC自动机 Aho-Corasick-Automation 单源最短路径(SPFA) Bellman-Ford(Queue-Optimised) 单源最短路径(Bellman-Ford) Bellman-Ford 使用Edmonds-Karp进行二分图匹配 Bigrpah-Matching(Edmonds-Karp) 普通的二叉搜索树 Binary-Search-Tree 广度优先搜索 Breadth-First-Search 冒泡排序 Bubble-Sort 桶排序 Bucket-Sort 组合数的递推求解 Combination(Recursion) 枚举组合 Combination 基本的复数类 Complex-Number 割点 Cut-Vertex 深度优先搜索 Depth-First-Search 堆优化的Dijkstra算法 Dijkstra(Heap-Optimised) 并查集 Disjoint-Set-Union 最大流Edmonds-Karp算法 Edmonds-Karp 欧拉函数 Euler's-Totient-Function 有向图的欧拉回路 Eulerian-Tour(Digraph) 拓展欧几里得算法 Extended-Euclid 简单的快速幂 Fast-Exponentiation 树状数组 Fenwick-Tree 所有结点对之间的最短路径(Floyd) Floyd-Warshall 凸包算法(Graham扫描法) Graham-Scan 辗转相除法求最大公约数 Greatest-Common-Divisor 堆排序 Heap-Sort ISAP算法 Improved-Shortest-Augmenting-Path(Naive) 插入排序 Insertion-Sort 字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log(n)) Longest-Increasing-Subsequence(n·log(n)) 倍增法求最近公共祖先 Lowest-Common-Ancestor(Doubling) 朴素的矩阵乘法 Matrix-Multiplication(Naive) 归并排序 Merge-Sort 最小堆 Min-Heap 乘法逆元 Modular-Multiplicative-Inverse 仅支持单点修改的可持久化线段树(维护区间和值) Persistent-Segment-Tree(Sum) 试除法素数测试 Prime-Check(Naive) 线性的素数筛法 Prime-Sieve(Linear) 队列的基本操作 Queue 快速排序的优化版本 Quick-Sort(Extra-Optimised) 快速排序的随机化版本 Quick-Sort(Randomized) 快速排序 Quick-Sort 使用向量叉积判断两个有向线段的时针关系 Segment-Direction 线段树维护区间最大值 Segment-Tree(Maximum) 线段树维护区间最小值 Segment-Tree(Minimum) 线段树维护区间和值 Segment-Tree(Sum) 普通的选择算法 Selection Eratosthenes素数筛法 Sieve-of-Erotosthenes 指针版的单向链表 Singly-Linked-List(Pointer) 跳表 Skip-List ST表 Sparse-Table 伸展树 Splay 博弈论SG函数 Sprague-Grundy 栈的基本操作 Stack 递推法求解无符号第一类斯特林数 Stirling-Number(Cycle,Unsigned,Recursion) 递推法求解第二类斯特林数 Stirling-Number(Subset,Recursion) 倍增法求解后缀数组 Suffix-Array(Doubling) 倍增法求解后缀数组(附带Height数组) Suffix-Array-with-Height(Doubling) 使用Tarjan算法求解强连通分量 Tarjan(Strongly-Connected-Components) 数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)