【刘庆源码共享】稀疏线性系统求解算法MGMRES(m) 之 基础类(Double类,封装double)

/* 
 * Copyright (c) 2009 湖南师范大学数计院 一心飞翔项目组
 * All Right Reserved
 *
 * 文件名:Double.h
 * 摘  要:定义一个与double对应的类,有助于捕捉处理 除数为0 的异常
 *
 * 作  者:刘 庆
 * 完成日期:2009年8月24日
 *
*/

#include <math.h>
#include <iostream>
#include <fstream>
#include "MyException.h"
#include "define.h"

#ifndef _DOUBLE__
#define _DOUBLE__

 

class Double
{
 double data;
public:
 Double()
 {
  data = 0.0;
 }
 Double(double d)
 {
  data = d;
 }
 ~Double(){ }

 double GetData()const
 {
  return data;
 }

 template <typename T> Double& operator = (const T t)
 {
  data = t;
  return *this;
 }
 Double& operator = (const Double& d)
 {
  data = d.data;
  return *this;
 }

 template <typename T> double operator / (const T t)
 {
  if (t == 0)
  {
   cout << "Divide By Zero Exception" << endl;
   return 0;
   throw DivideByZeroException("Divide By Zero Exception");
  }
  else
  {
   return data/t;
  }
 }
 double operator / (const Double& t)
 {
  if ( t.data==0 )
  {
   cout << "Divide By Zero Exception" << endl;
   return 0;
   throw DivideByZeroException("Divide By Zero Exception");
  }
  else
  {
   return data/t.data;
  }
 }
 template <typename T> double operator * (const T t)
 {
  return data*t;
 }
 double operator * (const Double& d)
 {
  return data*d.data;
 }
 template <typename T> double operator - (const T t)
 {
  return data - t;
 }
 double operator - (const Double& d)
 {
  return data - d.data;
 }
 template <typename T> double operator + (const T t)
 {
  return data + t;
 }
 double operator + (const Double& t)
 {
  return data + t.data;
 }
 template <typename T> Double& operator += (const T t)
 {
  data = data + t;
  return *this;
 }
 Double& operator += (const Double& t)
 {
  data = data + t.data;
  return *this;
 }
 template <typename T> Double& operator *= (const T t)
 {
  data = data*t;
  return *this;
 }
 Double& operator *= (const Double& t)
 {
  data = data * t.data;
  return *this;
 }
 template <typename T> Double& operator -= (const T t)
 {
  data = data - t;
  return *this;
 }
 Double& operator -= (const Double& t)
 {
  data = data - t.data;
  return *this;
 }
 template <typename T> Double& operator /= (const T t)
 {
  if (t == 0)
   throw DivideByZeroException("Divide By Zero Exception");
  else
  {
   data = data/t;
   return *this;
  }
 }
 Double& operator /= (const Double& t)
 {
  if(t.data==0)
   throw DivideByZeroException("Divide By Zero Exception");
  else
  {
   data = data/t.data;
   return *this;
  }
  return *this;
 }
 template <typename T> bool operator > (const T t) const
 {
  if(data > t)
   return true;
  else
   return false;
 }
 bool operator > (const Double& d)
 {
  if (data > d.data)
   return true;
  else
   return false;
 }
 template <typename T> bool operator < (const T t) const
 {
  if (data < t)
   return true;
  else
   return false;
 }
 bool operator < (const Double& d)
 {
  if (data < d.data)
   return true;
  else
   return false;
 } 
 template <typename T> bool operator >= (const T t) const
 {
  if (data >= t)
   return true;
  else
   return false;
 }
 bool operator >= (const Double& d)
 {
  if (data >= d.data)
   return true;
  else
   return false;
 }
 template <typename T> bool operator <= (const T t) const
 {
  if (data <= t)
   return true;
  else
   return false;
 }
 bool operator <= (const Double& d)
 {
  if (data<=d.data)
   return true;
  else
   return false;
 }
 template <typename T> bool operator == (const T t) const
 {
  if (t == 0)
  {
   if(fabs(data)<=_PRECIOUS)
    return true;
   else
    return false;
  }
  if (data == t)
   return true;
  else
   return false;
 }


 template <typename T> bool operator == (const T t)
 {
  if (t == 0)
  {
   if (fabs(data) <= _PRECIOUS)
    return true;
   else
    return false;
  }
  if (data == t)
   return true;
  else
   return false;
 }
 bool operator == (const Double& d)
 {
  if (data == d.data)
   return true;
  else
   return false;
 }
 template <typename T> bool operator != (const T t)const
 {
  if (t == 0)
  {
   if (fabs(data) > _PRECIOUS)
    return true;
   else
    return false;
  }
  if (data != t)
   return true;
  else
   return false;
 }
 template <typename T> bool operator != (const T t)
 {
  if (t == 0)
  {
   if (fabs(data) > _PRECIOUS)
    return true;
   else
    return false;
  }
  if (data != t)
   return true;
  else
   return false;
 }
 bool operator != (const Double& d)
 {
  if (data != d.data)
   return true;
  else
   return false;
 }
 friend ostream& operator << (ostream& os, Double& d)
 {
  os << d.data;
  return os;
 }
 friend istream& operator >> (istream& is, Double& d)
 {
  is >> d.data;
  return is;
 }
 friend ofstream& operator << (ofstream& ofs, Double& d)
 {
  ofs << d.data;
  return ofs;
 }
 friend ifstream& operator >> (ifstream& ifs, Double& d)
 {
  ifs >> d.data;
  return ifs;
 }
 bool EqualZero()
 {
  if (fabs(data) < _PRECIOUS)
   return true;
  else
   return false;
 }
 bool NotEqualZero()
 {
  return !EqualZero();
 }
};

 

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值