求改错,实现这个BigNumber class。

baibai6242 2012-03-04 01:41:18
求改错,实现这个BigNumber class。有很多变量方面的错误,本人对BigNumber(const float value,unsigned long int precision)和 BigNumber(const double value,unsigned long int precision) 及unsigned long int getFloatprecision

BigNumber.h


#include <iostream>
using namespace std;

#include "gmp-static/gmp.h"

class BigNumber {
public:
enum DATATYPE {INT, FLOAT, UNKNOWN}; // used to identify the type
private:
mpf_t myFloat;
mpz_t myInt;
DATATYPE DataType;
// default constructor, for internal class use only
BigNumber() {
DataType = UNKNOWN;
}
public:
BigNumber(const int value) {
DataType = INT;
mpz_init (myInt);
mpz_init_set_si(myInt, value);
}
BigNumber(const float value) {
DataType = FLOAT;
mpf_init (myFloat);
mpf_init_set_d(myFloat, (double)value);
}
BigNumber(const double value) {
DataType = FLOAT;
mpf_init (myFloat);
mpf_init_set_d(myFloat, value);
}

BigNumber(const float value, unsigned long int precision ) {
// fill this in
DataType = FLOAT;
mpf_init (myFloat);
mpf_init_set_d(myFloat, (double)value);
}

BigNumber(const double value, unsigned long int precision ) {
// fill this in
DataType = FLOAT;
mpf_init (myFloat);
mpf_init_set_d(myFloat, value);
}

BigNumber(const char a[]) {
if(strpbrk(a,".eE")==NULL)
{
DataType=INT;
myInt=atoi(a);
}
else
{
DataType=FLOAT;
myFloat=(float)atof(a);
}
}

// copy constructor
BigNumber(const BigNumber& rhs) {
DataType=rhs.DataType;
if(DataType==FLOAT){
mpf_set(myFloat,rhs.myFloat);
mpz_clear(myInt);
}
else{
mpz_set(myInt,rhs.myInt);
mpf_clear(myFloat);
}
}

BigNumber operator=(const BigNumber& rhs)const
{
BigNumber Temp;
if(rhs.DataType==FLOAT)
{
DataType=rhs.DataType;
Temp DataType=rhs.DataType;
mpf_set(myFloat,rhs.myFloat);
Temp(Temp.myFloat,rhs.myFloat);
mpz_clear(myInt);
}
else
{
DataType=rhs.DataType;
Temp DataType=rhs.DataType;
mpz_set(myInt,rhs.myInt);
mpz_set(Temp.myInt,rhs.myInt);
mpf_clear(myFloat);
}
return Temp;
}

BigNumber operator+(const BigNumber& rhs) const {
BigNumber Temp;
if(DataType==FLOAT)
{
if(rhs.DataType==FLOAT)
{
//float+float
Temp.DataType=FLOAT;
Temp.myFloat=myFloat+rhs.myFloat;
}
else
{
//float+int
Temp.DataType=FLOAT;
Temp.myFloat=myFloat+(float)rhs.myInt;
}
}
else
{
if(rhs.DataType==FLOAT)
{
//int+float
Temp.DataType=FLOAT;
Temp.myFloat=(float)myInt+rhs.myFloat;
}
else
{
//int+int
Temp.DataType=INT;
Temp.myInt=myInt+rhs.myInt;
}
}
return Temp;
}

BigNumber operator-(const BigNumber& rhs) const {
BigNumber Temp;
if(DataType==FLOAT)
{
if(rhs.DataType==FLOAT)
{
//float-float
Temp.DataType=FLOAT;
Temp.myFloat=myFloat-rhs.myFloat;
}
else
{
//float-int
Temp.DataType=FLOAT;
Temp.myFloat=myFloat-(float)rhs.myInt;
}
}
else
{
if(rhs.DataType==FLOAT)
{
//int+float
Temp.DataType=FLOAT;
Temp.myFloat=(float)myInt-rhs.myFloat;
}
else
{
//int+int
Temp.DataType=INT;
Temp.myInt=myInt-rhs.myInt;
}
}
return Temp;
}

unsigned long int getFloatPrecision() {
// fill this in
return 0;
}

// output
friend ostream& operator<< (ostream &out, BigNumber& value);

// other friends
friend static void setDefaultFloatPrecision(unsigned long int);
friend static unsigned long int getDefaultFloatPrecision();
};

ostream& operator<< (ostream &os, BigNumber& value) {
if(value.DataType==BigNumber::FLOAT)
{
for(int i=0;i<value.DataType;i++)
{
os <<value.myInt<<endl;
}
}
else
{
for(int i=0;i<value.DataType;i++)
{
os <<value.myFloat<<endl;
}
}
return os;
}

void setDefaultFloatPrecision(unsigned long int precision) {
mpf_set_default_prec(precision); // set the precision
}

unsigned long int getDefaultFloatPrecision() {
return mpf_get_default_prec(); // get the precision
}


/////////////////////////////main/////////////////////////
// GMP Framework
// January, 2008
//
// Using the GNU Multiple Precision Arithmetic Library (GMP)

#include <stdio.h>
#include <stdlib.h>
#include "BigNumber.h"
#include "gmp-static/gmp.h"

int main(int argc, char **argv) {

setDefaultFloatPrecision(1024 * 8);

BigNumber i1(0);
BigNumber f1(0.0f);
BigNumber i2("1");
BigNumber f2("1.1e0");
BigNumber i3(2);
BigNumber f3(2.1f);


cout << "Default Float Precision = " << getDefaultFloatPrecision() << endl;

f1 = f2 + f3; // float + float
cout << "f1 = f2 + f3 = " << f1 << endl;
f1 = i2 + f3; // int + float
cout << "f1 = i2 + f3 = " << f1 << endl;
f1 = f2 + i3; // float + int
cout << "f1 = f2 + i3 = " << f1 << endl;
i1 = i2 + i3; // int + int
cout << "i1 = i2 + i3 = " << f1 << endl;
i1 = f2 + f2 + i2 + f2; // int = float + float + int + float
cout << "i1 = f2 + f2 + i2 + f2 = " << i1 << endl;
f1 = f2 + f2 + i2 + f2; // int = float + float + int + float
cout << "f1 = f2 + f2 + i2 + f2 = " << f1 << endl;
//cout << f5 << endl;

BigNumber f4("123.4");
cout << f4 << endl;

BigNumber i4("1234");
cout << i4 << endl;

BigNumber X(f4); // copy contrructor
BigNumber XX(i4); // copy contrructor
BigNumber XXX(i4); // copy contrructor
BigNumber XXXX(f4); // copy contrructor

cout << X << " " << XX << " " << XXX << " " << XXXX << endl;
return 0;
}


///////////////////////////////////////////////////////////
http://pheatt.emporia.edu/courses/2012/cs555s12/TermProject/phase3/phase3.htm

这里有工程的下载,和要求。本人写的不好,请大神赐教!
...全文
57 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧