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

这篇具有很好参考价值的文章主要介绍了C/C++ 高精度(加减乘除)算法二进制优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高级精度算法系列

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



前言

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


一、基本原理

1、存储方式

存储二进制顺序由低到高位存储
高精度乘法优化,c++,c语言,c++,c语言,acm,算法,高精度

2、计算方式

计算方式与10进制存储计算方式基本一致,下面给出int8的计算方式,int16、int32以此类推本质是一样的。
高精度乘法优化,c++,c语言,c++,c语言,acm,算法,高精度


二、关键实现

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(本章)耗时
加法 测试用例1 0.002620s 0.0024862s
加法 测试用例2 0.005711s 0.0034712s
加法 测试用例3 0.005384s 0.003857s
累加 测试用例1 0.002536s 0.0027246s
累加 测试用例2 0.002592s 0.0029876s
累加 测试用例3 0.006474s 0.0043758s
减法 测试用例1 0.002078s 0.0022704s
减法 测试用例2 0.004939s 0.0032914s
减法 测试用例3 0.004929s 0.0041246s
累减 测试用例1 0.002034s 0.0020808s
累减 测试用例2 0.001942s 0.0023542s
累减 测试用例3 0.004282s 0.0044144s
乘法 测试用例1 0.004751s 0.0038996s
乘法 测试用例2 0.028358s 0.0117986s
乘法 测试用例3 0.064259s 0.0185958s
累乘 测试用例1 只计算1000次 0.000137s 0.000062s
累乘 测试用例2 只计算1000次 0.000187s 0.0000816s
累乘 测试用例3 只计算1000次 0.081988s 0.0292832s
除法 测试用例1 0.024763s 0.0196498s
除法 测试用例2 0.516090s 0.3556564s
除法 测试用例3 0.073812s 0.1716874s
累除 测试用例1 只计算1000次 0.035722s 0.0009416s
累除 测试用例2 只计算1000次 0.060936s 0.0131722s
累除 测试用例3 只计算500次 25.126072s 2.6210544s

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

图1、速度提升

高精度乘法优化,c++,c语言,c++,c语言,acm,算法,高精度


总结

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


到了这里,关于C/C++ 高精度(加减乘除)算法二进制优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

    这也是阿辉开的新专栏,知识将会很零散不成体系,不过绝对干货满满,今天这一篇 利用位运算实现加减乘除 费了阿辉九牛二虎之力,干的很自备饮水😆不多bb,进入今天的学习吧!!! 以下int均为有符号int,所求的加减乘除也是int类型的整型数 严谨 😏 在写加减乘除之前

    2024年02月03日
    浏览(28)
  • 不用加减乘除做加法

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号,本题OJ链接 数据范围:两个数都满足 −10≤n≤1000 进阶:空间复杂度 O(1),时间复杂度 O(1) 分析 :本题要求不能使用+、-、*、/,所以我们应该从二进制的角度去考虑,因为二进制的加法可以通

    2024年02月10日
    浏览(29)
  • bigdecimal加减乘除运算

    打印的结果如下: 打印结果如下: 打印结果如下:

    2024年02月11日
    浏览(34)
  • 图像四则运算(加减乘除)

    实验目的: 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 3.能够实现简单的图像处理 实验原理: 图像的代数运算包括加,减,乘,除,这些运算的主要对象是图像数据块中的数据。这四种代数运算可以由如

    2024年02月08日
    浏览(38)
  • C语言加减乘除运算

    加减乘除是常见的数学运算,C语言当然支持,不过,C语言中的运算符号与数学中的略有不同,请见下表。 加法 减法 乘法 除法 求余数(取余) 数学 + - × ÷ 无 C语言 + - * / % C语言中的加号、减号与数学中的一样,乘号、除号不同;另外C语言还多了一个求余数的运算符,就是

    2024年02月06日
    浏览(29)
  • 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了. 首先我们需要知道两数之和可以是两个数位相加和不进位相加之和, 而两数进

    2024年02月06日
    浏览(36)
  • Rust 复数运算,重载加减乘除运算

    复数定义 由实数部分和虚数部分所组成的数,形如a+bi 。 其中a、b为实数,i 为“虚数单位”,i² = -1,即虚数单位的平方等于-1。 a、b分别叫做复数a+bi的实部和虚部。 当b=0时,a+bi=a 为实数; 当b≠0时,a+bi 又称虚数; 当b≠0、a=0时,bi 称为纯虚数。 实数和虚数都是复

    2024年02月13日
    浏览(28)
  • Pytorch入门:Tensor加减乘除矩阵运算

    若张量维数大于2,则对最后两维进行matmul。进行此运算的要求是张量a与b除最后两维外的其他维必须一致:

    2024年02月12日
    浏览(31)
  • Python Opencv实践 - 图像的加减乘除

               

    2024年02月13日
    浏览(25)
  • Java进行数字计算 BigDecimal计算(加减乘除)

    Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四

    2023年04月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包