一般计算机是存在溢出的。要实现任意精度计算,不得不在软件上下功夫。
下面的程序用于计算2的任意高次幂。
===============================
clear all; close all; clc;
N = 67;
numdig = floor(N* log10(2)) + 1 ;
digits = zeros(1, numdig);
digits(end) = 1 ;
digit_current = 1 ;
for s = 1 : N
if digits(numdig - digit_current +1 ) > 4
digit_current = digit_current + 1 ;
end
for s2 = (numdig - digit_current +1) : (numdig-1)
if digits(s2 +1) <=4
digits(s2) = mod ( 2*digits(s2),10) ;
else
digits(s2) = mod(2*digits(s2) + 1, 10);
end
end
digits(end) = mod ( 2*digits(end),10) ;
end
digits
通过取N为67,我们计算了cole的问题,结果如下
digits =
1 4 7 5 7 3 9 5 2 5 8 9 6 7 6 4 1 2 9 2 8
这个算法当然是非常不经济同时效率低下的。别的不说,这里我们对每一位数字都用一个足以容纳一个整型数的空间来储存,在内存上浪费巨大。如何改进之,也许是个很好的本科生毕业设计课题。
一次是要分析一个波函数是否满足bethe ansatz形式。一个波函数由有限个平面波组成是个很苛刻的条件,我们想检验误差是否随浮点计算的精度提高而减小,所以需要高精度计算。相关文章在
Integrability and weak diffraction in a two particle Bose hubbard model.pdf
当时我们购买了一家日本公司(https://www.advanpix.com/ )开发的面向matlab的任意精度计算工具包,这家公司可能就老板一个人,研发和销售全他包了。售后很好,有问题秒回。
另外一次是要利用LLL算法寻找一个完全可积系统的poincare回归。庞加莱回归发生的时间是天文数字,所以我们需要高精度计算
Witnessing a Poincaré recurrence with Mathematica.pdf
这次我们是借用mathematica。
博主有个朋友专门做原子的精密谱计算,他们的办法是从intel采购专门的计算机,在硬件上就具有四精度甚至八精度。
作业1:修改程序,使得digits数组中每个元素存储5位数字。
作业2:编程计算 7189345829798321093*1237847291783641683763486342