[转]高精度乘法计算

转载自: Daywei 高精度乘法计算

高精度乘法计算基础

1.高精度浮点运算方法

  高精度浮点(Floating Point,FP)运算可以转换成整数型运算。由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI)、整数x小数(IxD)和小数x小数(DxD)。用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2

  (1)对于IxI型运算,所得的结果仍是整数

  (2)对于DxD型运算,所得结果仍是小数

  (3)对于IxD型运算,所得到的计算结果是一个浮点数,即可能包括整数和小数。

此时可以使用小数部分的每个单元分别乘以整数部分。这样对于n位小数,可以得到拥有n个数字的字符串。把第d位乘以整数部分所得到的所有数字向低位移动d位,则可以得到整数和小数部分的数字位,然后进行求和,即可以得到所需要的计算结果。

2.高精度乘法与移位计算

  由于在高精度计算中采用了数组或链表作为数值储存单元,因此可以使用移位计算代替乘法或除法运算。在对二进制计算中,对于一个数值,每个单元向 高位移动一位,得到的数值结果等于这个数乘以2,而向低位移动一位时,其结果等于这个数值除以2,如8>>1=4,8<< 1=16.同理,在高精度计算时,若进制基数为S,而向低位移动一位时,其结果等于这个数值除以S。注意,在移位后应把空出的低位设置为0.使用移位操作 代替乘法或除法计算,可以大大地提高计算效率。

高精度整数乘法

1.高精度与单精度整数乘法

  这种乘法运算与高精度加法类似,所不同的是,对于高精度数字由低位到高位逐位乘以单经读书。设高精度的数位数字为a[i],单精度数为b,则可以把a[i]*b除以进制的玉树作为更新a[i]的值,把其商数作为进位。

void mults( int a[], int na, int b, int c[], int * nc)
{
     int i,s,carry=0;
     for (i=0;i<na;i++)                               //高精度与单精度乘法
     {
          s=carry+a[i]*b;                             //本位数乘以单精度整数,在加上进位
          c[i]=s%10;                                    //计算本位数字
          carry=s/10;                                   //计算进位
     }
     while (carry!=0)                                  //对进位进行处理
     {
          c[na]=carry%10;                           //计算本位
          carry=carry/10;                             //计算进位
          na++;                                           //计算结果的数字长度
     }
      *nc=na;                                            //返回结果数字长度
}

  2.高精度与高精度整数乘法

  因为当两个高精度整数相乘时,所得到的积的位数最多不会超过最长整数的两倍,所以保存计算结果的变量空间可以设置为最长整数位数的两倍。当i和 j初始值从0开始,乘数的第i位a[i]与被乘数的第j位b[j]相乘时,则其结果可以加入到c[i+j]中,然后再进行进位处理

void multm( int a[], int na, int b[], int nb, int c[], int *nc)
{
     int i,j,s,carry=0;
     *nc=na+nb;                                  //乘积长度
     for (i=0;i<*nc;i++)   c[i]=0;           //乘积变量初始化
     for (i=0;i<na;i++)
     {
          for (j=0;j<nb;j++)
          {
               c[i+j]=c[i+j]+a[i]*b[j];       //两个整数数位与数位之间相乘
               c[i+j+1]=c[i+j+1]+c[i+j]/10; //进位
               c[i+j]=c[i+j]%10;                 //计算本位数字
          }
     }
}

  高精度浮点数乘法

1.整数与小数相乘

  在不考虑小数点的情况下,先计算整数与每个小数单元中的数字,每次可以 得到一个长整数,在根据当前小数单元的位置,确定对这个长整型的缩小位数。第1位小数,缩小10倍(这里以十进制为例),相当于将此长整数整体向右移动1 位。同理,对于第n为小数,相当于将此长整数整体向右移动n位。由此,每次计算都可以得到一个确定的整数和小数部分。对这些数值求和,即可以得到整数与小 数部分的乘积。

void ixd( int xi[], int ni, int yd[],intnd, int zi[], int zd[])
{
     int i,n,carry;
     int x1[MAXLEN],x2[MAXLEN],tmp[MAXLEN];
     for (i=0;i<ni;i++)  zi[i]=0;
     for (i=0;i<nd;i++)  zd[i]=0;
     for (i=0;i<nd;i++)                                      //循环小数数字单元
     {
          mults(xi,ni,yd[nd-i-1],tmp,&n);               //整数与每个小数位上的数字相乘
          rart(tmp,n,i+1,x1,ni,x2,nd);                  //从新整数中分离出整数和小数
          carry=add_int(zd,x2,zd,nd);                  //小数累加
          zi[0]+=carry;                                      //向整数进位
          add_int(zi,x1,zi,ni);                              //整数累加
     }
}
 
//通过移位把一个整数分解成两个整数,分别表述整数和小数部分。这种移位计算相当于乘法运算
void rpart( int a[], int maxn, int num, int ai[], int ni, int ad[], int nd[])
{
      int i;
      for (i=0;i<ni;i++) ai[i]=0;
      for (i=0;i<nd;i++) ad[i]=0;
      if (num<=maxn)                                                        //缩小位数小于给定的整数长度
     {
    for (i=0;i<maxn-num;i++)     ai[i]=a[num+i];            //计算得到整数数字单元中的数字
          for (i=0;i<num;i++)     ad[nd-num+i]=a[i];             //计算得到小数数字单元中的数字
  }
      else                                                                         //此情况下,整数部分全为0
      {
            for (i=0;i<maxn;i++)   ad[nd-num+i] =a[i];          //计算得到小数数字单元中的数字
      }
}

 2.两整数相乘与两小数相乘

 这两种乘法都可以使用长整数乘法来运算。整数与整数相乘的运算较简单,只需使用前面介绍的整数乘法函数运算即可。对于小数与小数相乘的运算,可以 先不考虑小数点问题,把他们作为两长整数进行运算。如1.85 x 2.123,在计算时,先不考虑小数点,直接计算85 x123=10455,它表示小数乘法0.85x0.123=0.10455  两个小数相乘后仍然是小数,其位数为这两个小数位数相加,因此其长度可能超过指定的小数位长度,此时需要将低位社区,可以使用一个截断字符串函数来进 行。这种截断也便于两小数相加时小数位对齐。在进行两个小数相加或相减时,必须需要注意“小数位对齐”,否则计算将出错

//用于对长度为maxn位的数字,以左为界,取出num位数字
     void ltruncate( int a[], int maxn, int b[], int num)
     {
         int i;
         for (i=manx-1;i>=maxn-num;i++)       //以左为界,取出num位数字
             b[i-maxn+num] =a[i];
     }

  3.浮点数与浮点数相乘

void multiply(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)
{
     int yi[MAXLEN],yd[MAXLEN];
     int xi1[MAXLEN],xd1[MAXLEN];
     int xi2[MAXLEN],xd2[MAXLEN];
     int nyi,nyd,carry1,carry2;
     
     if (a.sign==b.sign)                   //确定乘积符号
         c->sign=0;                       //乘积为正
     else
         c-.sign=1;                       //乘积为负
     
     c->ni=a.ni;                          //确定乘积整数长度
     c->nd=a.nd;                          //确定乘积小数长度
     
     multm(a.a,a.ni,b.a,b.ni,yi,&nyi);    //整数x整数
     multm(a.d,a.nd,b.d,b.nd,yd,&nyd);    //小数x小数
     ltruncate(yd,nyd,c->d,c->nd);        //小数位对齐
     ixd(a.a,a.ni,b.d,b.nd,xi1,xd1);      //整数x小数
     ixd(b.a,b.ni,a.d,a.nd,xi2,xd2);      //小数x整数
     
     carry1=add_int(c->d,xd1,c->d,c->nd); //关于小数部分的整数加法计算
     carry2=add_int(c->d,xd2,c->d,c->nd); //关于小数部分的整数加法计算
     
     yi[0]+=carry1+carry2;                //小数部分向整数部分进位
     add_int(yi,xi1,c->a,c->ni);          //整数加法计算
     add_int(c->a,xi2,c->a,c->ni);        //整数加法计算
}

  因此当任意给定两个高精度的浮点数后,使用以上的multily都可以计算他们的乘积

技术追求卓越 梦想创造未来

转载于:https://www.cnblogs.com/lastavengers/p/3871942.html

PHP实现高精度乘法(附完整源码) 阅读详情

相关推荐

HyperMesh实战:5种复杂载荷场景下的field映射技巧(附TCL脚本)

本文详细介绍了HyperMesh在5种复杂载荷场景下的field映射技巧,包括轴承载荷的圆柱坐标系映射、粉末压力中的切向力处理、实验数据到有限元模型的场映射、多工况载荷的组合映射以及局部细化网格的边界条件传递。通过实战案例和TCL脚本,帮助工程师高效解决有限元分析中的载荷映射难题,提升工作效率。

fanta的博客 294

poj 1001 uva 748 Exponentiation(高精度小数乘法)

题意是求R的n次方,R为0.0 到 99.999 的小数。

渐近自由 731

手把手教你用Python分析OpenFAST仿真结果:pyDatView处理.out文件与数据可视化技巧

本文详细介绍了如何使用Python中的pyDatView工具分析OpenFAST仿真结果,包括数据加载、质量检查、时域与频域分析、多工况对比及自动化报告生成。通过优化技巧和可视化方法,帮助工程师高效处理.out文件,提升风机性能分析的准确性和效率。

weixin_29311017的博客 183

c++高精度乘法(有超详细模拟样例)

跟高精度加法和高精度减法有所不同 ,高精度乘法只有一个大数字a,b是小数字,可以直接输入,不用开辟新数组。请同时结合代码体会下面的讲解,不然是看不懂的。本代码主要用于一个大数乘以一个小数。本代码中,t依旧是代表进位。本代码不支持两个大数相乘。

m0_74036487的博客 1168

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

Python实现PDB文件预处理

蛋白质结构研究依赖PDB文件存储的三维结构数据,但原始文件常含无关的水分子、离子和非标准残基等干扰信息。本文介绍了一个基于BioPython的Python预处理脚本,可自动清理PDB文件,主要功能包括:1)移除短于阈值的蛋白质链;2)过滤非标准氨基酸;3)可选保留水分子和金属离子。该脚本逻辑清晰,支持批量处理,能显著提升结构比对、分子对接等分析前的数据准备效率,为后续生物信息学研究提供更纯净的结构数据基础。

Protein Designer的博客 568

高精度加、减、乘、除及小数详解

关于高精度加、减、乘、除及小数的思想及代码模板

xiaozhu0602的博客 1159

银行一表通监管报送系统详解

国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。

银行信息系统应用架构详解 2517

高精度乘法计算

高精度乘法计算基础 1.高精度浮点运算方法   高精度浮点(Floating Point,FP)运算可以转换成整数型运算。由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI)、整数x小数(IxD)和小数x小数(DxD)。用表达式表示,则FP1*FP2=IP1*IP2...

weixin_30634661的博客 517

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3417

【AI智能体】Claude Code 高级编程技巧实战项目详解

Claude Code 高级编程技巧实战项目详解

congge 1万+

高精度算法之乘法运算

基于前面两个算法(如果还不清楚,建议点击这里跳转至加法实现去看看//构建两个字符数组以及对应存放数组长度的变量,以及输入//输入,回车即停止//记录数组长度//构建三个整形数组分别存放两个数以及结果数//并转化成整形数组并逆序存存放for (i = 0;i < len1;i++)//字符转整形的办法 字符-‘0’,然后逆序存放for (i = 0;i < len2;i++)3)核心逻辑实现1、确定结果数的数组长度。

2301_79475128的博客 2874

【知识分享】IBIS 建模指南 03

本文介绍了差分缓冲器的数据提取方法,重点分析了差分系统与单端系统的核心差异。文章详细阐述了差分接收机和驱动器的结构特点、工作原理及建模方法,指出全差分结构具有优异的电源噪声抑制能力。针对IBIS建模规范,作者提出了三维I-V曲面数据提取技术,并介绍了共模/差模电流分离、片上端接处理以及V-T表生成的解决方案。文章还探讨了差分电容(C_diff)的测量方法和数据简化策略,为复杂差分缓冲器的精确建模提供了系统化的技术路径。

一只豌豆象的博客 1282

c++高精度算法

c++语言 这是我的第一篇高精度文章。 什么是高精度 有时,我们要做特别大数据的计算。多大呢?几百万位,远远超过了long long的数据范围,直接用long long肯定会溢出。这时候我们就要用高精度算法 PS:python自带高精度 所有高精度算法的基本原理 大体的思路,就是用字符数组(因为字符数组可以达到一个下标对应一个数字,达到按位处理的目的),然后转到整形数组(整型数组才能进行计算)一个下标对应一个数字,用另一个数组进行按位相加。 高精度运算 现在只写高精度加法。以后会逐渐补充 加法 思路分析 我

欢迎来到jahn2007的博客 6641

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

float、double计算中精度丢失的处理

参考http://blog.youkuaiyun.com/luweicheng24/article/details/77800688import java.math.BigDecimal; public class T { public static void main(String[] args) { String aaString="37.10"; System.err.println(Do

codehxy的专栏 3997

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

高精度加法&乘法

高精度加法&乘法都是把数字进行运算,存储。

2303_79549479的博客 525

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算两个数的平方差——高精度减法乘法加法

/ a代表整数的绝对值,lena代表长度,f_a代表符号,如果是1,代表负数/*** 判断a是否大于等于b,如果成立,返回1,否则返回0* a 存储a整数的数组* lena a整数的长度*/if (lena!i >= 0;/*** 计算出 a - b,并且放在c中,保证 a >= b* 返回c的长度*/i < lenc;++i) {

2401_89583057的博客 1074

高精度的计算(加法乘法减法)

/反转,从最后往前面执行。//find_last_not_of从后往前找第一个不是字符'0'的位置+1从而到第一个字符‘0’

2301_80457143的博客 45

C++ 字符串实现高精度加法、乘法

C++高精度乘法

2401_87732330的博客 283

POJ 1001——高精度快速幂

POJ 1001——高精度快速幂 本题主要用到两个东西,一个是高精度,一个是快速幂。 虽然是浮点数的乘法,但是实际上可以转化为整数的乘法,然后再用高精度乘法,高精度算法本身不难,但是在没重载运算符的情况下使用数组还是挺麻烦的,不少地方的初始化都需要特别注意。 关于数组的初始化: 数组名在函数内部时,它的sizeof数组名获得的是数组本身的长度,而数组作为函数形参的时候,sizeof获得的是这个指针本身的长度,这一点特别坑,这会导致memset函数出现问题。 关于快速幂: 快速幂是一种快速求出数字的幂的方法,

qq_43513855的博客 1228

高精度乘法---C++题解

给出两个非负整数,求它们的乘积。

chenjinhao1202的博客 361

可怕的高精度(讲解)

• 场景:计算的加减乘除、阶乘、幂运算等。• 例子:◦ 计算 1000!(1000的阶乘),结果有2568位,远超long long的范围。◦ 计算 2^1000,结果有302位,long long无法存储。• 应用:◦ 密码学(RSA加密、大素数判定)◦ 组合数学(大数排列组合)◦ 算法竞赛(如动态规划中的大数计算)• 场景:需要的科学计算,如物理模拟、金融计算等。• 例子:◦ 计算圆周率π到小数点后1000位。◦ 金融领域的复利计算(避免浮点误差)。

Dream10062012的博客 470

高精度计算头文件分享

前一阵子从同学那里搞来了一个高精度计算的头文件,在获得许可后决定分享出来 代码在此: #ifndef CLEAR_H #define CLEAR_H #include <iostream> #include <algorithm> #include <string> #include <cstring> using namespace std; int A[1010], B[1010], sum[1010], mul[1010]; void s2..

A123456uuu的博客 273

高精度模拟算法

低精度/低精度 商为高精度型(保留小数点后。高精度/低精度型(逐位试商法)高精度/高精度型(减法模拟法)

椰萝Yerosius,开源运动支持者,主要研究计算机科学、人工智能、Linux系统、数据结构与算法。 508

C语言大数相加及相乘(高精度数字)

大数相加及相乘(高精度数字)前言高精度数字的加法高精度数字的乘法 前言 在C语言中明确的规定了数字的类型及其大小,但是在一些时候,int或long类型不能满足数据的要求,所以我们需要寻找一些其他方法来计算这些数字。 高精度数字的加法 分析: 此时数字的范围超出了最大整形范围,那我们应该用什么方式来存储这个数字呢? 我们首先想到了数组,可以用字符数组的每一个元素存储整数的每一个数;这样我们就可以将两个数字存放入我们的两个字符串中。 在进行运算前,需要明确下面几点: 1.字符转数字,减去‘0’;数字转字符加

The_onion的博客 2117

高精度模板

pascal模板 字符串转数组 procedure change(var s:ansistring; var a:arraytype; var a1:longint); var t:longint; begin t:=length(s); for i:=t downto 1 do val(s[i],a[t-i+1]); a1:=t; end; ...

weixin_30344131的博客 72
上一篇: 《30天自制操作系统》读书笔记(3) 引入C语言
下一篇: 《30天自制操作系统》读书笔记(4) 绘图
dingjin9321
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值