如何用matlab做高精度计算?【第二辑】

这篇具有很好参考价值的文章主要介绍了如何用matlab做高精度计算?【第二辑】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如32位CPU中一个整数最大只能取值4,294,967,295(=2^32-1),因此在超范围数值计算中,往往要采用模拟手段。通常使用分离字符的方法来处理数字数组。

维基百科【高精度计算】

在上一辑中,给大家介绍了如何使用matlab自带工具箱实现高精度计算(详见:如何用matlab做高精度计算?【第一辑】)。本期给大家带来两款来自File Exchange源代码共享资源库的宝贝,它们都是出自大神John D'Errico之手。前者是专门用于处理超大值整数运算的 —— Variable Precision Integer Arithmetic,对应数据类型为vpi,后者是用于处理浮点数计算的 —— HPF (a big decimal class),对应数据类型为hpf

接下来咱们就一起来揭开这两款工具箱的神秘面纱。

一、Variable Precision Integer Arithmetic

从名称不难看出,VPI工具箱是专门用于处理整数相关计算的,而大神John D'Errico开发VPI工具箱的目的也很简单,因为他不能用MATLAB符号处理工具箱,而他的这种款工具箱意义已经超越了其初衷。正所谓前人栽树,后人乘凉。有了VPI这款工具箱,原则任意的大整数计算在MATLAB都可以实现。接下来就一起来看看如何使用这款工具吧!

1.1 创建VPI类型数据

vpi类型数据创建有以下四种方法:

① num = vpi; 创建一个值为0的变量;

② num = vpi([]); 创建一个空的vpi变量

③ num = vpi(1415926); 将整数转换成vpi类型数字

④ num = vpi('12345678900987654321'); 将符号型整数转换成vpi类型数字

注:为了防止因MATLAB精度限制造成超大整数无法完整准确表达,建议对于超大整数使用符号型整数来处理。

1.2 类型数据类型转换

使用double或single可以将vpi型数据转换成MATLAB的double或single型,但此操作会造成数据精度损失,如下图所示:

如何用matlab做高精度计算?【第二辑】

1.3 VPI类型数据的运算

vpi类型的数据除支持四则运算、比较运算外,还支持指数、开方等复杂运算规则,因vpi型数据是整数型数据,开方时只会得到最近的整数结果。

如何用matlab做高精度计算?【第二辑】

如何用matlab做高精度计算?【第二辑】

1.4 VPI类型数据进制转换

vpi型数据还有特殊功能,支持数据进制转换,相关的函数有:

vpi2base:vpi型数据到任意进制转换;

vpi2bin:vpi型数据到二进制转换;

vpi2english:vpi型数据的英语读法;

base2vpi:任意进制到vpi型数据;

bin2vpi:二进制到vpi型数据;

如何用matlab做高精度计算?【第二辑】

1.5 vpi类所支持的方法

Methods for class vpi:
abs                double             gcd                isprime            lt                 ne                 rdivide            sum                vpi2english        
ceil               eq                 ge                 isunit             max                nthroot            rem                times              
comparemagnitudes  exp                gt                 iszero             min                num2str            round              trailingdigit      
conv               factor             isequal            lcm                minus              order              shiftdec           uminus             
cumprod            factorial          iseven             le                 mod                plus               sign               unique             
cumsum             find               isfinite           leadingdigit       mpower             power              single             uplus              
digits             fix                isinf              log                mrdivide           prod               sort               vpi                
disp               floor              isnan              log10              mtimes             quotient           sortrows           vpi2base           
display            full               isnumeric          log2               nchoosek           randint            sqrt               vpi2bin

除了上面介绍的内容外,VPI工具箱更多功能函数小伙伴自己去探究吧,因篇幅不宜过长,咱就介绍到此。总而言之,VPI工具箱非常强大,能满足在matlab中的绝大部分整数计算需求。

二、High Precision Floating

大神John D'Errico在分享了超大整数计算工具箱后又分享了任意精度浮点数计算工具箱 —— High Precision Floating (HPF)。与上一期介绍的如何用matlab做高精度计算?【第一辑】一样,作为浮点数计算,首先需要人为自定义计算所需要的精度,如果不设置,则会使用默认的精度进行计算。

1.1 hpf类型数据数据精度定义

hpf型数据精度设置涉及到两个函数 —— DefaultNumberOfDigits

DefaultDecimalBase。前者用于设置浮点数位数,后者用于设置存储数字的字段长度。

DefaultNumberOfDigits使用方式如下:

DefaultNumberOfDigits(nDigits,sDigits),其中nDigits是实际显示浮点数位数,sDigits是保护位数,因为浮点数计算比纯整数计算误差更不易掌控,因此数据实际显示位数后再加sDigits位数据来确保前面数据的准确性。

使用方式:
① DefaultNumberOfDigits(nDigits)
② DefaultNumberOfDigits(nDigits,sDigits)
③ DefaultNumberOfDigits nDigits
④ DefaultNumberOfDigits nDigits sDigits

DefaultDecimalBase使用方式如下:

DefaultDecimalBase(DBase),其中,DBase只能取1,2,3,4,5或6,DBase取不同值,能表示最大浮点数位数各不相同,如下:

DBase = 1 --> 3.6e14 decimal digits
DBase = 2 --> 3.6e12 decimal digits
DBase = 3 --> 3.6e10 decimal digits
DBase = 4 --> 3.6e8 decimal digits
DBase = 5 --> 3.6e6 decimal digits
DBase = 6 --> 36000 decimal digits

如何用matlab做高精度计算?【第二辑】

DBase越大,计算速度越快,反正越慢。故默认DBase为6,对于计算不是特别大时,建议不要修改Dbase。

2.2 hpf类型数据的创建

hpf类型数据创建有以下五种方法:

① num = hpf; 创建一个值为0的变量;

② num = hpf([]); 创建一个空的hpf变量

③ num = hpf(3.141592653589793238462); 将整数转换成hpf类型数字

④ num = hpf('3.141592653589793238462'); 将符号型整数转换成hpf类型数字

⑤ num = hpf('3.141592653589793238462',num); 将符号型整数转换成hpf类型数字,并指定位数为num。

和vpa函数一样,如果需要创建高精度hpf型数据,建议不要采用方法③,因为会受matlab的浮点数有效位数的影响导致被截断。

2.3 hpf类所支持的方法

和vpi类型数据一样,hpf类型数据也是一种数据类,在命令窗口输入methods('hpf')即可查看hpf所支持的所有方法。

Methods for class hpf:
abs                asinh              csc                erf                int32              lt                 plus               sign               uint32             
acos               atan               cscd               exp                int64              lu                 power              sin                uint64             
acosd              atand              csch               factorial          int8               mantissa           prod               sind               uint8              
acosh              atanh              cubrt              fix                isfinite           max                rank               single             uminus             
acot               augmentdigits      cumprod            floor              isinf              min                rat                sinh               uplus              
acotd              ceil               cumsum             fminsearch         isnan              minus              rdivide            sort               vpi                
acsc               chol               det                fractionalpart     isnumeric          mod                reciprocal         sqrt               
acscd              cos                diag               full               iszero             mpower             round              sum                
adjustdecimalbase  cosd               disp               ge                 le                 mrdivide           roundn             tan                
asec               cosh               display            gt                 linspace           mtimes             rref               tand               
asecd              cot                double             hpf                log                ne                 sec                tanh               
asin               cotd               eps                int16              log10              nthroot            secd               times              
asind              coth               eq                 int2str            log2               num2str            sech               uint16             


Static methods:
eye                ones               ten                zeros

2.4 hpf型数据应用案例 (来源于作者提供的帮助文档)

使用Chudnovsky公式计算π:

DefaultNumberOfDigits 5000 10
DefaultDecimalBase 5
a1 = hpf(13591409); % small integers, so exact
a2 = hpf(545140134);
a3 = hpf(640320);
a4 = a3.*a3.*a3;
num = hpf(1);
den = sqrt(a4);
tol = eps(num);
piinv = hpf(0);
k = 0;
while 1


  piterm = num.*(a1+a2.*k)./den;
  piinv = piinv + piterm;


  if abs(piterm) < tol
    break
  end


  k = k + 1;
  num = num.*prod(hpf(6*k+(-5:0)));
  den = den.*a4.*(3*k-2).*(3*k-1).*(3*k).*hpf(k).^3;


  num = -num;


end
piest = reciprocal(12.*piinv)

Ref: en.wikipedia.org/wiki/Chudnovsky_algorithm

以上就是matlab做高精度计算第二辑的全部内容,更多地应用伙伴们自己去开发,本文仅是作为引子的作用。下一辑将会为大家介绍一款收费的高精度计算工具箱 —— Multiprecision Computing Toolbox,执行效率远超matlab自带的vpa工具箱。欲知后事如何,且看下回分解!

参考资料:

[1] www.mathworks.com/help/symbolic/vpa.html

[2] https://zh.m.wikipedia.org/zh-hans/高精度计算

如需转载,请在懂科学的程序员公众号中回复“转载”获取授权!文章来源地址https://www.toymoban.com/news/detail-466351.html

到了这里,关于如何用matlab做高精度计算?【第二辑】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++基础算法①——高精度加减法计算

    当我们利用计算机进行数值计算,有时候会遇到这样的问题: n!的精确结果是多少? 当n小于30的时候,我们当然可以通过电脑自带的计算器计算出来。但是当我们遇到 100! 的时候就没有办法直接计算出精确的结果。再比如,求两个20000位的数的和。 那怎么解决精度缺失的问

    2024年02月16日
    浏览(36)
  • C语言 加减乘除模 的 高精度计算 (超详细)

    目录 高精度加法 高精度乘法 高精度减法          高精度除法 高精度模法   高精度计算 是模拟算法的一种,通过字符串和整型数组的使用,将加减乘除的竖式运算 模拟 出来,达到计算的目的。其步骤大致分为:一,将字符串数据存到整型数组中,二,模拟算法,不同的

    2023年04月24日
    浏览(32)
  • (基础算法)高精度加法,高精度减法

    什么叫做高精度加法呢?包括接下来的高精度减法,高精度乘法与除法都是同一个道理。正常来讲的话加减乘除,四则运算的数字都是整数,也就是需要在int的范围之内,但当这个操作数变得非常\\\"大\\\"的时候( 其实就是一个字符串,比方说有一个数是20位,如果用整数视角来

    2024年02月01日
    浏览(35)
  • 深入理解Python中的math和decimal模块:数学基础与高精度计算实战【第104篇—math和decimal模块】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python中, math 和 decimal 模块是处理数学运算的重要工具。 math 提供了一系列常见的数学函数,而 decimal 则专注于高精度的浮点数运算。本文

    2024年03月19日
    浏览(40)
  • 【计算机视觉】不仅能分割一切简单物体,而且还能高精度分割一切复杂物体的SAM升级版本HQ-SAM来了

    相信很多朋友都对Facebook开源的Segement Anything(SAM)算法有很深的印象,当前SAM已经被开发出众多的热门应用,至今为止,可能已经有很多朋友用它来提升自己的工作与生产效率。 虽然SAM算法效果很好,但是当碰到复杂的图像分割任务时,SAM输出的效果并不能满足我们的需求。

    2024年02月06日
    浏览(40)
  • 高精度加法

    高精度问题是指两个数字非常大,超过了 int ,甚至 long long 的范围,数字的位数甚至能达到 (10^5) ,那么如果要实现这样两个大数字的运算,需要解决以下两个问题: 如何存储? 这样的两个数字相加是不可能用普通类型来存储的,所以我们第一个要解决的问题就是如何存储

    2024年02月08日
    浏览(33)
  • 高精度除法

    高精度除法和乘法讨论的一样,都是一个大整数和一个小整数之间的运算。 算法思路 根据小学除法一样,我们还是模拟这个过程。 注意这里遍历 (A) 数组的时候要按照我们读数字的顺序,也就是从数组尾部到头部遍历。 每一位的计算过程应该是,上一轮的余数 (r) 乘 (

    2024年02月08日
    浏览(37)
  • 高精度/前缀和/差分

    存储方式: 整数的长度一般小于1e6 大整数的每一位存储到数组里 存储时低位在前,高位在后,方便进位 高精度加法 每一位相加Ai + Bi + t, t表示进位取值0/1,逢十进一 模板: 高精度减法 每一位相减Ai - Bi - t, t 表示借位取值0/1 模板: 高精度乘法 A * b ,b=10000, len(A) = 1e6 , 乘的

    2024年02月16日
    浏览(31)
  • 高精度乘法

    高精度加减法讨论的是两个大整数之间的运算。 而这里高精度乘除法讨论的是一个大整数和一个小整数之间的关系。 算法思路: 还是模拟小学的乘法列竖式,只不过此时不太一样,原本的列竖式是一位一位的乘,这里需要改变一下思路。 这里直接把小整数当成一个数,所乘

    2024年02月08日
    浏览(35)
  • 高精度算法笔记·····························

    加法 减法 乘法 除法 高精度加法的步骤: 1.高精度数字利用字符串读入 2.把字符串 翻转 存入两个整型数组A、B 3.从低位到高位,逐位求和,进位,存余 4.把数组C从高位到低位依次输出         1.2为准备         3为加法具体实现(0按位取反为-1,即-1时结束等价于=0)  

    2024年01月21日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包