C/C++ 高精度(加减乘除)算法二进制优化

news2024/9/20 9:45:20

高级精度算法系列

第一章 简单实现
第二章 压位优化
第三章 二进制优化(本章)


文章目录

  • 高级精度算法系列
  • 前言
  • 一、基本原理
    • 1、存储方式
    • 2、计算方式
  • 二、关键实现
    • 1、整型转高精度数组(二进制)
    • 2、字符串转高精度数组(二进制)
    • 3、高精度数组(二进制)转字符串
  • 三、完整代码
  • 四、性能对比
  • 总结


前言

上一章《C/C++ 高精度(加减乘除)算法压位优化》实现了优化的高精度计算,采用int32的整型数组每个元素可以储存9个10进制数字,想要再进一步优化计算速度,可以改变数据存储方式,采用二进制存储数字。依然采用int32数组其元素通过二进制来存储数字,这样做不仅运算效率高,而且空间利用率也达到了最高。


一、基本原理

1、存储方式

存储二进制顺序由低到高位存储
在这里插入图片描述

2、计算方式

计算方式与10进制存储计算方式基本一致,下面给出int8的计算方式,int16、int32以此类推本质是一样的。
在这里插入图片描述


二、关键实现

1、整型转高精度数组(二进制)

通过位操作既可以实现(元素类型int32为例):

/// <summary>
/// 通过无符号整型初始化
/// </summary>
/// <param name="a">[in]高精度数组</param>
/// <param name="value">[in]整型值</param>
static void loadInt(int* a, uint64_t value) {
	a[1] = (uint32_t)value;
	a[2] = value >> (sizeof(int) * 8);
	a[0] = a[2] ? 2 : 1;
}

2、字符串转高精度数组(二进制)

在这里提供一种方法,此方法需要先实现高精度加以及乘。
(1)初始化高精度数组值为0
(2)逐个获取字符串中的数字
(3)高精度数组乘等于10
(4)获取的数字与高精度数组相加(整型转高精度数组参考上一节)
(5)字符串未读取完回到(2)

3、高精度数组(二进制)转字符串

这里提供一种方法,需要上一章的实现作为辅助《C/C++ 高精度(加减乘除)算法压位优化》
(1)初始化压9位高进度数组值为0
(2)逐个获取高精度数组(二进制)的元素
(3)压9位高进度数组乘等于2^32(二进制数组元素类型int32为例)
(4)获取的元素与9位高进度数组相加
(5)元素未读取完回到(2)
(6)压9位高进度数组转字符串


三、完整代码

因为接口以及使用方法与第一章《C/C++ 高精度(加减乘除)算法简单实现》是完全一致的,所以这里只提供完整代码,使用示例请参考第一章
基于int32数组二进制存储实现的高精度算法:
https://download.csdn.net/download/u013113678/87720242


四、性能对比

测试平台:Windows 11
测试设备:i7 8750h
测试方式:测试5次取均值
表1、测试用例

测试用例描述
1整型范围数字计算500000次
2长数字与整型范围数字计算500000次
3长数字与长数字计算500000次

基于上述用例编写程序进行测试,测试结果如下表
表2、测试结果

计算测试用例压9位优化(上一章)耗时二进制优化int32(本章)耗时
加法测试用例10.002620s0.0024862s
加法测试用例20.005711s0.0034712s
加法测试用例30.005384s0.003857s
累加测试用例10.002536s0.0027246s
累加测试用例20.002592s0.0029876s
累加测试用例30.006474s0.0043758s
减法测试用例10.002078s0.0022704s
减法测试用例20.004939s0.0032914s
减法测试用例30.004929s0.0041246s
累减测试用例10.002034s0.0020808s
累减测试用例20.001942s0.0023542s
累减测试用例30.004282s0.0044144s
乘法测试用例10.004751s0.0038996s
乘法测试用例20.028358s0.0117986s
乘法测试用例30.064259s0.0185958s
累乘测试用例1 只计算1000次0.000137s0.000062s
累乘测试用例2 只计算1000次0.000187s0.0000816s
累乘测试用例3 只计算1000次0.081988s0.0292832s
除法测试用例10.024763s0.0196498s
除法测试用例20.516090s0.3556564s
除法测试用例30.073812s0.1716874s
累除测试用例1 只计算1000次0.035722s0.0009416s
累除测试用例2 只计算1000次0.060936s0.0131722s
累除测试用例3 只计算500次25.126072s2.6210544s

将上表数据进行分类相同类型取均值计算出提升速度如下图所示,仅作参考。

图1、速度提升

在这里插入图片描述


总结

以上就是今天要讲的内容,二进制存储优化在对比压9位优化速度还有提升,而且存储方式与整型一样,很好的利用了空间。相比较与压9位算法,二进制算法对于乘法和除法的提升较大,尤其是长数据运算的提升更为明显。本章算法的二进制转换方法实现参考了c# 的BigInt,总的来说,这是一个性能比较好的高精度算法,比较适用于项目开发。


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

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

相关文章

小程序进阶

1.1组件基础 自定义组件的结构与页面是一致的&#xff0c;即也包含有4个部分&#xff0c;分别为: .wxml 组件的布局结构 .js 组件的处理逻辑 .json 组件的配置文件 .wxstngs 组件的布局样式 1.1.1创建组件 通常将组件放到独立的目录components当中这个目录需要手动创建 …

Spring Boot的配置文件

目录 配置文件的作用 配置文件的格式 properties配置文件 格式 注释乱码问题 读取配置文件 properties的优缺点分析 YAML yml基本语法 yml配置的读取 注意事项:value的值加单双引号 配置对象 yml优点分析 properties和yml的区别 设置不同环境的配置文件 配置文件的…

Linux-搭建web服务器

综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.…

SpringCloud --- Ribbon负载均衡

一、负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 二、源码跟踪 为什么我们只输入了service名称就…

浅谈: 计算机—JVM—Java线程—池

计算机的基本组成 计算机的基本组成 计算机存储模型(CPU、寄存器、高速缓存、内存、外存) 现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM)&#xff0c;普通内存一般是DRAM&#xff0c;这种读写速度更快的介质充当CPU和内存之间的…

3 连续模块(二)

3.5 零极点增益模块 在控制系统设计和分析中&#xff0c;常用的函数包括 传递函数&#xff08;tf&#xff09;、零极点&#xff08;zpk&#xff09;和状态空间&#xff08;ss&#xff09;函数 传递函数&#xff08;tf&#xff09;&#xff1a;用于表示线性时不变系统的输入输出…

SQL Compliance Manager Crack

SQL Compliance Manager Crack 新的SQL CM云代理-扩展了当前SQL CM代理的功能&#xff0c;以支持EC2上Microsoft SQL服务器的远程审核。允许用户添加在共享网络位置上活动的SQL Server&#xff0c;以写入/读取数据并支持DBaaS SQL Server实例。云代理包含与当前SQL代理相同的行…

VS code 插件之中英文间自动添加空格

前言 不知道大家在开发过程中是不是会遇到写代码注释或者文本内容时中英文之间没有空格的情况&#xff0c;很多时候在写代码尤其是写注释的时候容易忘记加空格&#xff0c;但回过头来看又难以忍受&#xff0c;于是我就想着自己写一个 vscode 插件来解决这个问题&#xff0c;希…

跟我一起开启 linux 的学习吧

跟我学 CentOS 的安装 一、安装 VMware二、创建虚拟机三、安装 CentOS 7四、linux 的登录 一、安装 VMware VMware 计算机虚拟化软件 从官网 https://www.vmware.com/cn.html 下载并安装 这里就不再展示安装过程啦&#xff01; 有需要的可以 点击这里 →→→ VMware 下载安装过…

postgresql 源码结构分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 源码下载 源码结构 核心代码目录 结尾 前言 本文对postgresql源码目…

进销存管理系统和ERP的工作原理和实现方式有何不同?

一、ERP是什么&#xff1f; ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;&#xff0c;是一种集成管理软件系统。它的目的是整合和规划各种企业资源和业务流程&#xff0c;包括财务、物流、采购、生产、销售等&#xff0c;以提高企业的管理效率和业…

Java -- IO流

IO流 主要用于读写数据 IO流按照流的方向可以分为以下两种&#xff1a; 输入流输出流 IO流按照操作文件类型可以分为以下两种&#xff1a; 字节流字符流 字节流可以操作所有类型的文件&#xff0c;而字符流只可以操作纯文本文件 #mermaid-svg-tfFZjSluOmEFUpyc {font-fam…

SVM-老师讲的真的很好!

支持向量机(Support Vector Machine) 如同逻辑回归一样,SVM是一个分类模型 目标 SVM解决分类模型的基本思路:什么是一个好的分类边界? SVM认为,好的分类决策边界应当是:类别边界的距离应当尽可能的远 目标函数 拉格朗日乘子法 那么我们的公式就可以写为

SIP协议之通话转接

一、介绍 在SIP协议应用中&#xff0c;有一个常用的功能叫通话转接&#xff0c;用于将接通后的通话转给第三方接听处理。 二、原理及流程 转接是通过SIP协议的一个扩展请求方法REFER实现的。呼叫转接由RFC5589(Session Initiation Protocol (SIP) Call Control - Transfer)定义…

(数字图像处理MATLAB+Python)第六章图像平滑-第一节:图像平滑概述和空间域平滑滤波

文章目录 一&#xff1a;图像中的噪声&#xff08;1&#xff09;图像噪声分类&#xff08;2&#xff09;图像噪声的数学模型&#xff08;3&#xff09;程序 二&#xff1a;空间域平滑滤波&#xff08;1&#xff09;均值滤波A&#xff1a;均值滤波原理B&#xff1a;示例C&#x…

203、【栈与队列】leetcode ——剑指 Offer II 040. 矩阵中最大的矩形 / 85. 最大矩形:暴力+单调栈(C++/Pyhont版本)

题目描述 Problem: 剑指 Offer II 040. 矩阵中最大的矩形 文章目录 题目描述解法一&#xff1a;暴力解法思路解题方法复杂度Code 解法二&#xff1a;单调栈解法 解法一&#xff1a;暴力解法 思路 首先&#xff0c; 按行获取到达某一元素位置时&#xff0c;之前与当前连续1的个…

【JUC高并发编程】—— 初见JUC

一、JUC 概述 什么是JUC JUC 是 Java并发编程的缩写&#xff0c;指的是 Java.util.concurrent 即Java工具集下的并发编程库 【说白了就是处理线程的工具包】 JUC提供了一套并发编程工具&#xff0c;这些工具是Java 5以后引入的&#xff0c;使得Java开发者可以更加方便地编写…

86页2023年新型智慧城市顶层设计规划解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 整体架构 智慧城市建设从顶层设计入手&#xff0c;结合软硬件资源整合能力&#xff0c;为公众提供全生命周期一站式服务管理。智慧城市的整体框架分为发展战略层、技术实施层…

HuggingFace入门教程--环境搭建

HuggingFace中文直译为”拥抱脸“&#xff0c;是最近非常火爆的一个人工智能社区&#xff0c;官网地址是&#xff1a;https://huggingface.co/ .关于HuggingFace的相关介绍大家可以自行百度。本文主要为刚入人工智能坑的小白指下路&#xff0c;同时也是逼着自己记录下学习过程中…

Cuckoo Filter

其他判重数据结构 Bloom Filter 无法支持删除和计数的功能&#xff0c;需要更多的存储空间来存储数据 因为在CS中&#xff0c;删除和计数是常见的操作&#xff0c;但是这会对布隆过滤器的存储空间产生影响&#xff0c;同样为了实现这一操作&#xff0c;需要更多的存储空间 数…