完备计算器的制作方法

文档序号:31145793发布日期:2022-08-16 23:36阅读:45来源:国知局
完备计算器的制作方法

1.本发明涉及1种计算器,属于计算机领域。


背景技术:

2.公知的计算器只能运行7种算子运算:加算子运算、减算子运算、乘算子运算、除算子运算、幂算子运算、开方算子运算、对数算子运算。文献[1](xie,pith.a logical calculus to intuitively and logically denote number systems.progress in applied mathematics.april 2011,vol.1,no.2,pages43to 70,issn 1925-2528.)、文献[2](xie,pith.number systems based on logical calculus.international mathematical forum.vol.8,no.34,(2013),1663-1689.)、文献[3](xie,pith.improvement on operator axioms and fundamental operator functions.international journal of mathematics and its applications.volume 5,issue 2-a(2017),125-151.)发现了无穷个实算子(real operators)运算。文献[4](xie,pith peishu.numerical computations for operator axioms.aims mathematics.2021,6(4):4011-4024.)构造了实算子运算的数值计算方法。文献[4]将实算子运算定义为完备运算(complete operations)。完备运算的表达式为a+
′nb、a
‑′nb或a/
′nb。本文将addote用中文命名为“加引”。本文将subote用中文命名为“减引”。本文将logote用中文命名为“对引”。“加引”运算对应a+
′nb。“减引”运算对应a
‑′nb。“对引”运算对应a/
′nb。迄今为止,尚无一种公开的计算器能够运行完备运算。
[0003]
本文设计一种完备计算器,它能够运行完备运算。目前尚无文献公开此类产品的制造方法。


技术实现要素:

[0004]
本发明旨在提供一种完备计算器及其操作方法,完备计算器能够运行完备运算。
[0005]
完备计算器(complete calculator)包括以下组件:处理器、存储器、输入设备、输出设备、电源。完备计算器运行10进制小数的完备运算,因此至少应用16种专用符:
‘0’

‘1’

‘2’

‘3’

‘4’

‘5’

‘6’

‘7’

‘8’

‘9’


.’、

-'、

+'’、

-'’、

/'’、

=’。输入设备必须可以输入上述16种专用符。输出设备必须可以输出如下11种专用符:
‘0’

‘1’

‘2’

‘3’

‘4’

‘5’

‘6’

‘7’

‘8’

‘9’


.’、

-'。如无特殊说明,本文中的“小数”指代“10进制小数”。
[0006]
专用符分成3类:数字符、运算符、等号符。数字符包括:
‘0’

‘1’

‘2’

‘3’

‘4’

‘5’

‘6’

‘7’

‘8’

‘9’


.’、

-'。运算符包括:

+'’,

-'’,

/'’。等号符包括:

=’。数字符可以组合成1个实数。
[0007]
当输入设备依次输入左运算数、实算子、算子等级、右运算数、等号符后,完备计算器就会运行完备运算并输出给定精度的近似结果。完备运算运行一些算法。完备运算中的求根算法使用文献[4]中提供的二分法算法。完备运算使用高精度计算(arbitrary-precision arithmetic)算法,从而输出任意精度数值的运算结果。
[0008]
完备运算的算法也可以集成在处理器中。处理器可以提供完备运算指令集,这些处理器指令可以更快地运行完备运算。
附图说明
[0009]
图1展示完备计算器,其中:
[0010]
1-左运算数;2-实算子;3-算子等级;4-精度;5-右运算数;6-运算结果;具体实施方法
[0011]
下面参照附图详细说明本发明的实施方法。
[0012]
完备计算器包括以下组件:处理器、存储器、操作系统、完备运算软件、输入设备、输出设备、电源。处理器是intel i7处理器,内存是三星8g内存,硬盘是希捷1t硬盘,操作系统是windows 10系统,输入设备是鼠标和键盘,输出设备是液晶显示器。
[0013]
完备计算器应用16种专用符:
‘0’

‘1’

‘2’

‘3’

‘4’

‘5’

‘6’

‘7’

‘8’

‘9’


.’、

-',

+'’,

-'’,

/'’,

=’。因此,输入设备必须可以输入上述16种专用符。专用符分成3类:数字符、运算符、等号符。数字符包括:
‘0’

‘1’

‘2’

‘3’

‘4’

‘5’

‘6’

‘7’

‘8’

‘9’


.’、

-'。运算符包括:

+'’,

-'’,

/'’。等号符包括:

=’。数字符可以组合成1个实数。
[0014]
完备运算运行一些算法。当输入设备依次输入左运算数、实算子、算子等级、右运算数、等号符后,完备计算器就会运行完备运算并输出给定精度的近似结果。完备运算使用高精度计算(arbitrary-precision arithmetic)算法,从而输出任意精度数值的运算结果。高精度计算算法由开源软件库mpir和mpfr来实现。mpir和mpfr在windows平台上编译输出了以下文件:gmp.h、mpfr.h、mpir.lib、mpir.dll、mpfr.lib、mpfr.dll。
[0015]
完备计算器编译环境为:qt开发框架、visual studio 2015编译器、c++开发语言。完备计算器使用2个开源软件库:mpir、mpfr。mpir和mpfr用于高精度计算。完备计算器的头文件引入了gmp.h、mpfr.h。完备计算器的库文件包括了mpir.lib、mpir.dll、mpfr.lib、mpfr.dll。完备运算中的求根算法使用文献[4]中提供的二分法算法。
[0016]
完备计算器项目名称是operator。它包括以下文件:operator.pro、gmp.h、mpfr.h、mainwindow.h、operation.h、main.cpp、mainwindow.cpp、operation.cpp。
[0017]
operator.pro包括以下配置语句:
[0018]
libs+=mpfr.lib
[0019]
libs+=mpir.lib
[0020]
headers+=gmp.h\
[0021]
ꢀꢀꢀꢀꢀꢀ
mpfr.h\
[0022]
ꢀꢀꢀꢀꢀꢀ
operation.h
[0023]
sources+=operation.cpp
[0024]
operation.h定义了类operation。它包括以下语句:
[0025]
#include《qthread》
[0026]
#include《math.h》
[0027]
#include"mpfr.h"
[0028]
class operation;
[0029]
typedef void(operation::*fp)(mpfr_t,const mpfr_t,const int,mpfr_t,
mpfr_t);
[0030]
class operation:public qthread
[0031]
{
[0032]
ꢀꢀꢀꢀꢀꢀ
q_object
[0033]
public:
[0034]
ꢀꢀꢀꢀꢀꢀ
explicit operation();
[0035]
ꢀꢀꢀꢀꢀꢀ
~operation();
[0036]
ꢀꢀꢀꢀꢀꢀ
//计算prefix function输出值
[0037]
ꢀꢀꢀꢀꢀꢀ
void prefix(mpfr_t y,const mpfr_t x,const int level,mpfr_t r,mpfr_t l);
[0038]
ꢀꢀꢀꢀꢀꢀ
//计算suffix function输出值
[0039]
ꢀꢀꢀꢀꢀꢀ
void suffix(mpfr_t y,const mpfr_t x,const int level,mpfr_t r,mpfr_t l);
[0040]
ꢀꢀꢀꢀꢀꢀ
//二分法算法
[0041]
ꢀꢀꢀꢀꢀꢀ
void bisection(fp f,mpfr_t x1,mpfr_t x2,mpfr_t err,mpfr_t x,const int level,mpfr_t g,mpfr_t h);
[0042]
ꢀꢀꢀꢀꢀꢀ
/*
[0043]
ꢀꢀꢀꢀꢀꢀ
output:运算结果
[0044]
ꢀꢀꢀꢀꢀꢀ
loperand:左运算数
[0045]
ꢀꢀꢀꢀꢀꢀ
level:算子等级
[0046]
ꢀꢀꢀꢀꢀꢀ
roperand:右运算数
[0047]
ꢀꢀꢀꢀꢀꢀ
*/
[0048]
ꢀꢀꢀꢀꢀ
void addote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand);
[0049]
ꢀꢀꢀꢀꢀꢀ
/*
[0050]
ꢀꢀꢀꢀꢀꢀ
output:运算结果
[0051]
ꢀꢀꢀꢀꢀꢀ
loperand:左运算数
[0052]
ꢀꢀꢀꢀꢀꢀ
level:算子等级
[0053]
ꢀꢀꢀꢀꢀꢀ
roperand:右运算数
[0054]
ꢀꢀꢀꢀꢀꢀ
err:error
[0055]
ꢀꢀꢀꢀꢀꢀ
*/
[0056]
ꢀꢀꢀꢀꢀꢀ
void subote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand,mpfr_t err);
[0057]
ꢀꢀꢀꢀꢀꢀ
/*
[0058]
ꢀꢀꢀꢀꢀꢀ
output:运算结果
[0059]
ꢀꢀꢀꢀꢀꢀ
loperand:左运算数
[0060]
ꢀꢀꢀꢀꢀꢀ
level:算子等级
[0061]
ꢀꢀꢀꢀꢀꢀ
roperand:右运算数
[0062]
ꢀꢀꢀꢀꢀꢀ
err:error
[0063]
ꢀꢀꢀꢀꢀꢀ
*/
[0064]
ꢀꢀꢀꢀꢀꢀ
void logote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand,mpfr_t err);
[0065]
protected:
[0066]
ꢀꢀꢀꢀꢀꢀ
void run();
[0067]
signals:
[0068]
ꢀꢀꢀꢀꢀꢀ
void sendmsg(qstring msg);
[0069]
public:
[0070]
ꢀꢀꢀꢀꢀꢀ
mpfr_t err;//精度
[0071]
ꢀꢀꢀꢀꢀꢀ
mpfr_exp_t et;
[0072]
ꢀꢀꢀꢀꢀꢀ
int vec;
[0073]
ꢀꢀꢀꢀꢀꢀ
mpfr_t*x;
[0074]
ꢀꢀꢀꢀꢀꢀ
mpfr_t*y;
[0075]
ꢀꢀꢀꢀꢀꢀ
int level;
[0076]
ꢀꢀꢀꢀꢀꢀ
mpfr_t g;
[0077]
ꢀꢀꢀꢀꢀꢀ
mpfr_t h;
[0078]
ꢀꢀꢀꢀꢀꢀ
qmainwindow*mainptr;
[0079]
};
[0080]
operation.cpp实现了类operation中的方法。它包括以下语句:
[0081]
#include"operation.h"
[0082]
operation::operation()
[0083]
{
[0084]
ꢀꢀꢀꢀꢀꢀ
mpfr_set_emax(mpfr_get_emax_max());
[0085]
ꢀꢀꢀꢀꢀꢀ
mpfr_set_emin(mpfr_get_emin_min());
[0086]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(err);
[0087]
ꢀꢀꢀꢀꢀꢀ
mpfr_set_d(err,0.000000001,mpfr_rndn);
[0088]
ꢀꢀꢀꢀꢀꢀ
vec=2;
[0089]
ꢀꢀꢀꢀꢀꢀ
x=new mpfr_t[vec];
[0090]
ꢀꢀꢀꢀꢀꢀ
y=new mpfr_t[vec];
[0091][0092]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《vec;i++)
[0093]
ꢀꢀꢀꢀꢀꢀ
{
[0094]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(x[i]);
[0095]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(y[i]);
[0096]
ꢀꢀꢀꢀꢀꢀ
}
[0097]
}
[0098]
operation::~operation()
[0099]
{
[0100]
ꢀꢀꢀꢀꢀꢀ
if(x!=null)
[0101]
ꢀꢀꢀꢀꢀꢀ
{
[0102]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(int i=0;i《vec;i++)
[0103]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0104]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(x[i]);
[0105]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0106]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
x=null;
[0107]
ꢀꢀꢀꢀꢀꢀ
}
[0108]
ꢀꢀꢀꢀꢀꢀ
if(y!=null)
[0109]
ꢀꢀꢀꢀꢀꢀ
{
[0110]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(int i=0;i《vec;i++)
[0111]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0112]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(y[i]);
[0113]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0114]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
y=null;
[0115]
ꢀꢀꢀꢀꢀꢀ
}
[0116]
ꢀꢀꢀꢀꢀꢀ
this-》quit();
[0117]
ꢀꢀꢀꢀꢀꢀ
this-》wait();
[0118]
}
[0119]
void operation::run()
[0120]
{
[0121]
}
[0122]
void operation::prefix(mpfr_t y,const mpfr_t x,const int level,mpfr_t r,mpfr_t l)
[0123]
{
[0124]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[3];
[0125]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《3;i++)
[0126]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0127][0128]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],x,mpfr_rndn);
[0129]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[1],r,mpfr_rndn);
[0130]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],l,mpfr_rndn);
[0131][0132]
ꢀꢀꢀꢀꢀꢀ
addote(y,v[0],level,v[1]);
[0133]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_inf_p(y)!=0)
[0134]
ꢀꢀꢀꢀꢀꢀ
{
[0135]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_inf(y,mpfr_rndn);
[0136]
ꢀꢀꢀꢀꢀꢀ
}
[0137]
ꢀꢀꢀꢀꢀꢀ
else
[0138]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(y,y,v[2],mpfr_rndn);
[0139][0140]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《3;i++)
[0141]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0142]
}
[0143]
void operation::suffix(mpfr_t y,const mpfr_t x,const int level,mpfr_t r,mpfr_t l)
[0144]
{
[0145]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[3];
[0146]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《3;i++)
[0147]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0148][0149]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],x,mpfr_rndn);
[0150]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[1],r,mpfr_rndn);
[0151]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],l,mpfr_rndn);
[0152][0153]
ꢀꢀꢀꢀꢀꢀ
addote(y,v[1],level,v[0]);
[0154]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_inf_p(y)!=0)
[0155]
ꢀꢀꢀꢀꢀꢀ
{
[0156]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_inf(y,mpfr_rndn);
[0157]
ꢀꢀꢀꢀꢀꢀ
}
[0158]
ꢀꢀꢀꢀꢀꢀ
else
[0159]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(y,y,v[2],mpfr_rndn);
[0160][0161]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《3;i++)
[0162]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0163]
}
[0164]
/*
[0165]
f:函数指针
[0166]
x1:根区间下界
[0167]
x2:根区间上界
[0168]
err:误差
[0169]
x:方程根
[0170]
level:算子等级
[0171]
g:运算数
[0172]
h:运算数
[0173]
*/
[0174]
void operation::bisection(fp f,mpfr_t x1,mpfr_t x2,mpfr_t err,mpfr_t x,const int level,mpfr_t g,mpfr_t h)
[0175]
{
[0176]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[4];
[0177]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《4;i++)
[0178]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0179][0180]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],x1,mpfr_rndn);
[0181]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[1],x2,mpfr_rndn);
[0182]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],g,mpfr_rndn);
[0183]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[3],h,mpfr_rndn);
[0184][0185]
ꢀꢀꢀꢀꢀꢀ
mpfr_t a,b,c,d;
[0186]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(a);
[0187]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(b);
[0188]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(c);
[0189]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(d);
[0190]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(a,v[0],mpfr_rndn);
[0191]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(b,v[1],mpfr_rndn);
[0192]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(c,v[1],mpfr_rndn);
[0193][0194]
ꢀꢀꢀꢀꢀꢀ
mpfr_t fa,fb,fc;
[0195]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(fa);
[0196]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(fb);
[0197]
ꢀꢀꢀꢀꢀꢀ
mpfr_init(fc);
[0198]
ꢀꢀꢀꢀꢀꢀ
(this-》*f)(fa,a,level,v[2],v[3]);
[0199]
ꢀꢀꢀꢀꢀꢀ
(this-》*f)(fb,b,level,v[2],v[3]);
[0200][0201]
ꢀꢀꢀꢀꢀꢀ
if((mpfr_cmp_si(fa,0)》0&&mpfr_cmp_si(fb,0)》0)||(mpfr_cmp_si(fa,0)《0&&mpfr_cmp_si(fb,0)《0))
[0202]
ꢀꢀꢀꢀꢀꢀ
{
[0203]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
emit sendmsg("root must be bracketed.");
[0204][0205]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(a);
[0206]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(b);
[0207]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(c);
[0208]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(d);
[0209]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fa);
[0210]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fb);
[0211]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fc);
[0212]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(int i=0;i《4;i++)
[0213]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0214][0215]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0216]
ꢀꢀꢀꢀꢀꢀ
}
[0217][0218]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp(fa,fb)》0)
[0219]
ꢀꢀꢀꢀꢀꢀ
{
[0220]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_swap(a,b);
[0221]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_swap(fa,fb);
[0222]
ꢀꢀꢀꢀꢀꢀ
}
[0223][0224]
ꢀꢀꢀꢀꢀꢀ
while(true)
[0225]
ꢀꢀꢀꢀꢀꢀ
{
[0226]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(d,b,a,mpfr_rndn);
[0227]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp(d,err)《0)
[0228]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0229]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(x,a,mpfr_rndn);
[0230]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0231]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0232][0233]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(c,b,a,mpfr_rndn);
[0234]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_div_si(c,c,2,mpfr_rndn);
[0235]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_add(c,a,c,mpfr_rndn);
[0236]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(this-》*f)(fc,c,level,v[2],v[3]);
[0237][0238]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(fc,0)==0)
[0239]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0240]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(x,c,mpfr_rndn);
[0241][0242]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(a);
[0243]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(b);
[0244]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(c);
[0245]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(d);
[0246]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fa);
[0247]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fb);
[0248]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(fc);
[0249]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(int i=0;i《4;i++)
[0250]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0251][0252]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0253]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0254]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(fc,0)《0)
[0255]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0256]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(a,c,mpfr_rndn);
[0257]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(fa,fc,mpfr_rndn);
[0258]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0259]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0260]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0261]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(b,c,mpfr_rndn);
[0262]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(fb,fc,mpfr_rndn);
[0263]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0264]
ꢀꢀꢀꢀꢀꢀ
}
[0265][0266]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(a);
[0267]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(b);
[0268]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(c);
[0269]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(d);
[0270][0271]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(fa);
[0272]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(fb);
[0273]
ꢀꢀꢀꢀꢀꢀ
mpfr_clear(fc);
[0274][0275]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《4;i++)
[0276]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0277]
}
[0278]
/*
[0279]
output:addote运算+'的输出值
[0280]
loperand:左运算数
[0281]
level:addote运算+'的等级
[0282]
roperand:右运算数
[0283]
*/
[0284]
void operation::addote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand)
[0285]
{
[0286]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_nan_p(loperand)!=0||mpfr_nan_p(roperand)!=0)
[0287]
ꢀꢀꢀꢀꢀꢀ
{
[0288]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(output);
[0289]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0290]
ꢀꢀꢀꢀꢀꢀ
}
[0291]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_inf_p(loperand)!=0||mpfr_inf_p(roperand)!=0)
[0292]
ꢀꢀꢀꢀꢀꢀ
{
[0293]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_inf(output,mpfr_rndn);
[0294]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0295]
ꢀꢀꢀꢀꢀꢀ
}
[0296]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[10];
[0297]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《10;i++)
[0298]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0299][0300]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],output,mpfr_rndn);
[0301]
ꢀꢀꢀꢀꢀ
mpfr_set(v[1],loperand,mpfr_rndn);//v[1]=a
[0302]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],roperand,mpfr_rndn);
[0303][0304]
ꢀꢀꢀꢀꢀꢀ
switch(level)
[0305]
ꢀꢀꢀꢀꢀꢀ
{
[0306]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 0:
[0307]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0308]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0309]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 1:
[0310]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_add(v[0],v[1],v[2],mpfr_rndn);
[0311]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0312]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 2:
[0313]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul(v[0],v[1],v[2],mpfr_rndn);
[0314]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0315]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 3:
[0316]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],0)==0&&mpfr_cmp_si(v[2],0)==0)
[0317]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0318]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0319]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_pow(v[0],v[1],v[2],mpfr_rndn);
[0320]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0321]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
default:
[0322]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],1)《0)
[0323]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0324]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0325]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0326]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[1],1)==0)
[0327]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0328]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[0],1,mpfr_rndn);
[0329]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0330]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0331]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0332]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[2],0)==0)
[0333]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0334]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[0],1,mpfr_rndn);
[0335]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0336]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[2],1)==0)
[0337]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0338]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],v[1],mpfr_rndn);
[0339]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0340]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[2],0)》0)
[0341]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0342]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[4]=b
[0343]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_modf(v[3],v[4],v[2],mpfr_rndn);
[0344][0345]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[5]=k=n-3
[0346]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[5],level-3,mpfr_rndn);
[0347][0348]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//b=b^k
[0349]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_pow(v[4],v[4],v[5],mpfr_rndn);
[0350][0351]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[6]=r=a-1
[0352]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub_si(v[6],v[1],1,mpfr_rndn);
[0353][0354]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[7]=1
[0355]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[7],1,mpfr_rndn);
[0356][0357]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[8]=b^2
[0358]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_pow_si(v[8],v[4],2,mpfr_rndn);
[0359]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul(v[8],v[8],v[6],mpfr_rndn);
[0360]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul_si(v[8],v[8],3,mpfr_rndn);
[0361]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_add(v[7],v[7],v[8],mpfr_rndn);
[0362][0363]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[9]=b^3
[0364]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_pow_si(v[9],v[4],3,mpfr_rndn);
[0365]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul(v[9],v[9],v[6],mpfr_rndn);
[0366]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul_si(v[9],v[9],2,mpfr_rndn);
[0367][0368]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//f(b)
[0369]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(v[0],v[7],v[9],mpfr_rndn);
[0370][0371]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_t ite;
[0372]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(mpfr_init_set_si(ite,0,mpfr_rndn);mpfr_cmp(ite,v[3])《0;mpfr_add_si(ite,ite,1,mpfr_rndn))
[0373]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0374]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[0],v[1],level-1,v[0]);
[0375]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_nan_p(v[0])!=0||mpfr_inf_p(v[0])!=0)
[0376]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0377]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0378]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(ite);
[0379]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0380]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0381]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0382]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
//v[3]=-b
[0383]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_si_sub(v[3],0,v[2],mpfr_rndn);
[0384]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[4],v[1],level,v[3]);
[0385]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_si_div(v[0],1,v[4],mpfr_rndn);
[0386]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0387]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0388]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0389]
ꢀꢀꢀꢀꢀꢀ
}
[0390]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(output,v[0],mpfr_rndn);
[0391]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《10;i++)
[0392]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0393]
}
[0394][0395]
/*
[0396]
output:subote运算-'的输出值
[0397]
loperand:左运算数
[0398]
level:subote运算-'的等级
[0399]
roperand:右运算数
[0400]
err:error
[0401]
*/
[0402]
void operation::subote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand,mpfr_t err)
[0403]
{
[0404]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_nan_p(loperand)!=0||mpfr_nan_p(roperand)!=0)
[0405]
ꢀꢀꢀꢀꢀꢀ
{
[0406]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(output);
[0407]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0408]
ꢀꢀꢀꢀꢀꢀ
}
[0409]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_inf_p(loperand)!=0||mpfr_inf_p(roperand)!=0)
[0410]
ꢀꢀꢀꢀꢀꢀ
{
[0411]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_inf(output,mpfr_rndn);
[0412]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0413]
ꢀꢀꢀꢀꢀꢀ
}
[0414][0415]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[7];
[0416]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《7;i++)
[0417]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0418][0419]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],output,mpfr_rndn);
[0420]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[1],loperand,mpfr_rndn);
[0421]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],roperand,mpfr_rndn);
[0422][0423]
ꢀꢀꢀꢀꢀꢀ
switch(level)
[0424]
ꢀꢀꢀꢀꢀꢀ
{
[0425]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 0:
[0426]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0427]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0428]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 1:
[0429]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(v[0],v[1],v[2],mpfr_rndn);
[0430]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0431]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 2:
[0432]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[2],0)==0)
[0433]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0434]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0435]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_div(v[0],v[1],v[2],mpfr_rndn);
[0436]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0437]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 3:
[0438]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],0)《=0||mpfr_cmp_si(v[2],0)==0)
[0439]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0440]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0441]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0442]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0443]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0444]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_ui_div(v[2],1,v[2],mpfr_rndn);
[0445]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_pow(v[0],v[1],v[2],mpfr_rndn);
[0446]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0447]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0448]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
default:
[0449]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[2],0)==0)
[0450]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0451]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0452]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0453]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[1],1)《0&&mpfr_cmp_si(v[2],0)》0)
[0454]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0455]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0456]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0457]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if((mpfr_cmp_si(v[1],0)《=0&&mpfr_cmp_si(v[2],0)《0)||(mpfr_cmp_si(v[1],1)》0&&mpfr_cmp_si(v[2],0)《0))
[0458]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0459]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0460]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0461]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0462]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0463]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[2],1)==0)
[0464]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0465]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],v[1],mpfr_rndn);
[0466]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0467]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[2],0)》0)
[0468]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0469]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[3],1,mpfr_rndn);
[0470]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[4],2,mpfr_rndn);
[0471]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[5],err,mpfr_rndn);
[0472][0473]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[4],level,v[2]);
[0474]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
while(mpfr_cmp(v[6],v[1])《0)
[0475]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0476]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[3],v[4],mpfr_rndn);
[0477]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul_si(v[4],v[4],2,mpfr_rndn);
[0478]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[4],level,v[2]);
[0479]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0480]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bisection(&operation::prefix,v[3],v[4],v[5],v[0],level,v[2],v[1]);
[0481]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0482]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0483]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0484]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_si_div(v[1],1,v[1],mpfr_rndn);
[0485]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_si_sub(v[2],0,v[2],mpfr_rndn);
[0486]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
subote(v[0],v[1],level,v[2],err);
[0487]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0488]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0489]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0490]
ꢀꢀꢀꢀꢀꢀ
}
[0491]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(output,v[0],mpfr_rndn);
[0492]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《7;i++)
[0493]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0494]
}
[0495]
/*
[0496]
output:logote运算/'的输出值
[0497]
loperand:左运算数
[0498]
level:logote运算/'的等级
[0499]
roperand:右运算数
[0500]
err:error
[0501]
*/
[0502]
void operation::logote(mpfr_t output,mpfr_t loperand,int level,mpfr_t roperand,mpfr_t err)
[0503]
{
[0504]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_nan_p(loperand)!=0||mpfr_nan_p(roperand)!=0)
[0505]
ꢀꢀꢀꢀꢀꢀ
{
[0506]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(output);
[0507]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0508]
ꢀꢀꢀꢀꢀꢀ
}
[0509]
ꢀꢀꢀꢀꢀꢀ
if(mpfr_inf_p(loperand)!=0||mpfr_inf_p(roperand)!=0)
[0510]
ꢀꢀꢀꢀꢀꢀ
{
[0511]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_inf(output,mpfr_rndn);
[0512]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return;
[0513]
ꢀꢀꢀꢀꢀꢀ
}
[0514][0515]
ꢀꢀꢀꢀꢀꢀ
mpfr_t v[7];
[0516]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《7;i++)
[0517]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_init(v[i]);
[0518][0519]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[0],output,mpfr_rndn);
[0520]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[1],loperand,mpfr_rndn);
[0521]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(v[2],roperand,mpfr_rndn);
[0522][0523]
ꢀꢀꢀꢀꢀꢀ
switch(level)
[0524]
ꢀꢀꢀꢀꢀꢀ
{
[0525]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 0:
[0526]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0527]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0528]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 1:
[0529]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_sub(v[0],v[1],v[2],mpfr_rndn);
[0530]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0531]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 2:
[0532]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[2],0)==0)
[0533]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0534]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0535]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_div(v[0],v[1],v[2],mpfr_rndn);
[0536]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0537]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
case 3:
[0538]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],0)《0||mpfr_cmp_si(v[1],0)==0||
[0539]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_cmp_si(v[2],0)《0||mpfr_cmp_si(v[2],0)==0)
[0540]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0541]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0542]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0543]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0544]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0545]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_log(v[1],v[1],mpfr_rndn);
[0546]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_log(v[2],v[2],mpfr_rndn);
[0547]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_div(v[0],v[1],v[2],mpfr_rndn);
[0548]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0549]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0550]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
default:
[0551]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],0)《=0||mpfr_cmp_si(v[2],1)《=0)
[0552]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0553]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_nan(v[0]);
[0554]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0555]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp_si(v[1],1)==0)
[0556]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0557]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[0],0,mpfr_rndn);
[0558]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0559]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else if(mpfr_cmp(v[1],v[2])==0)
[0560]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0561]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[0],1,mpfr_rndn);
[0562]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0563]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0564]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0565]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(mpfr_cmp_si(v[1],1)》0)
[0566]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0567]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[3],0,mpfr_rndn);
[0568]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[4],1,mpfr_rndn);
[0569]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[5],err,mpfr_rndn);
[0570][0571]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[2],level,v[4]);
[0572]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
while(mpfr_cmp(v[6],v[1])《0)
[0573]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0574]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[3],v[4],mpfr_rndn);
[0575]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul_si(v[4],v[4],2,mpfr_rndn);
[0576]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[2],level,v[4]);
[0577]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0578][0579]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bisection(&operation::suffix,v[3],v[4],v[5],v[0],level,v[2],v[1]);
[0580]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0581]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
else
[0582]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0583]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[3],0,mpfr_rndn);
[0584]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set_si(v[4],-1,mpfr_rndn);
[0585]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[5],err,mpfr_rndn);
[0586][0587]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[2],level,v[4]);
[0588]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
while(mpfr_cmp(v[6],v[1])》0)
[0589]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
[0590]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_set(v[3],v[4],mpfr_rndn);
[0591]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_mul_si(v[4],v[4],2,mpfr_rndn);
[0592]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
addote(v[6],v[2],level,v[4]);
[0593]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0594][0595]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
bisection(&operation::suffix,v[4],v[5],v[6],v[0],level,v[2],v[1]);
[0596]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0597]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
[0598]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;
[0599]
ꢀꢀꢀꢀꢀꢀ
}
[0600]
ꢀꢀꢀꢀꢀꢀ
mpfr_set(output,v[0],mpfr_rndn);
[0601]
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《7;i++)
[0602]
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
mpfr_clear(v[i]);
[0603]
}
[0604]
当输入设备依次输入左运算数、+'、算子等级、右运算数、等号符后,完备计算器就会运行addote函数并输出给定精度的近似结果;当输入设备依次输入左运算数、-'、算子等级、右运算数、等号符后,完备计算器就会运行subote函数并输出给定精度的近似结果;当输入设备依次输入左运算数、/'、算子等级、右运算数、等号符后,完备计算器就会运行logote函数并输出给定精度的近似结果。
[0605]
完备计算器的实验结果如表1所示。其中,算子等级位于实算子下标处,完备运算精度是10-9
。完备运算输出2+
′42.35.00377689090274823+
′42.3199.863711347493192+
′52.34.00005263480204843+
′52.321590520079800.5472
‑′431.47668433655053383
‑′431.63507847394794232
‑′531.57195951044559483
‑′531.73108039423823362/
′450.326351821422576903/
′450.500000000000000002/
′550.571272108703851703/
′550.70710678026080132表1.完备计算器的实验结果
[0606]
综上所述,完备计算器就可以运行完备运算。完备运算的算法也可以集成在集成电路中,而该集成电路则可以快速运行完备运算指令。例如,该集成电路可以运行addote、subote、logote等指令。
[0607]
以上叙述及图像已揭示本发明的较佳实施例。该实施例应被视为用以说明本发明,而非用以限制本发明。本发明的保护范围,并不局限于该实施例。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1