亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tlargefloat.cpp

?? 利用數值分析方法
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "TLargeFloat.h"
#include "assert.h"
#include <math.h>
#include <iostream>


 bool TLargeFloat::FloatIsInteger(long double fValue)//浮點數是否為可表示整數
{
 return (TMaxInt(floor(fValue))==fValue);
}

unsigned int TLargeFloat::DigitsSize(unsigned int uiDigitsLength)
{
    if (!(uiDigitsLength>=1))
 {
  throw TException("ERROR:TLargeFloat::DigitsSize()");
 }
 return (uiDigitsLength+(em10Power-1))/em10Power;//計算出需要的數組大小
}

TLargeFloat::TLargeFloat(long double DefultFloatValue,const TDigits& DigitsLength)
:m_Digits(DigitsSize(DigitsLength.GetDigits()),0)
{
    m_Exponent=0;
    m_Sign=0;
 *this=DefultFloatValue;
}

TLargeFloat::TLargeFloat(long double FloatValue,const TCharacter&)//內部使用 浮點數轉化為 TLargeFloat,并采用默認精度
:m_Digits(DigitsSize(emLongDoubleDigits),0)
{
    m_Exponent=0;
    m_Sign=0;
 *this=FloatValue;
}

TLargeFloat::TLargeFloat(const SelfType& Value)
:m_Digits(Value.m_Digits)
{
    m_Exponent=Value.m_Exponent;
    m_Sign=Value.m_Sign;
}

TLargeFloat::SelfType& TLargeFloat::operator =  (const SelfType& Value)
{
    m_Digits=Value.m_Digits;
    m_Exponent=Value.m_Exponent;
    m_Sign=Value.m_Sign;
    return *this;
}

void TLargeFloat::SetDigitsLength(unsigned int uiDigitsLength)//重新設置10進制有效位數
{
 m_Digits.resize(DigitsSize(uiDigitsLength),0);
}

unsigned int TLargeFloat::GetDigitsLength() const//返回當前的10進制有效位數
{
 return m_Digits.size()*em10Power;
}


void TLargeFloat::Clear()
{
    //清零
    int size=m_Digits.size();
    for (int i=0;i<size;++i)
        m_Digits[i]=0;
    m_Exponent=0;
    m_Sign=0;
}

TLargeFloat::SelfType& TLargeFloat::operator =  (long double   fValue)
{
    Clear();
    if (0==fValue)
    {
        //do nothing;
    }
    else
    {
        if (fValue>0)
            m_Sign=1;
        else
        {
            m_Sign=-1;
            fValue=-fValue;
        }

        if (FloatIsInteger(fValue))//對 為"可表示整數" 的浮點數 進行特殊處理 無誤差轉換
        {
            long double tf=fValue;
            int n=0;
   for (;;++n)
            {
                if (0==tf) break;
                tf/=emBase;
                tf=floor(tf);
            }    
            m_Exponent=n*em10Power;
            for (int i=0;i<n;++i)
            {
                m_Digits[n-1-i]=Int32bit(TMaxInt(fValue)%emBase);
                fValue=floor(fValue/emBase);
            }
        }
        else//一般的浮點數   轉化中可能產生小的誤差
        {
            m_Exponent=int(floor(log10(fValue)))+1;//得到10為底的指數
            fValue/=pow(10.0,(long double)(m_Exponent.AsInt()));
   int size=m_Digits.size();
   int minsize=Private_::min(size,emLongDoubleDigits/em10Power+1);
            for (int i=0;i<minsize;++i)//得到小數位
            {
                if (0==fValue) break;
                fValue*=emBase;
                Int32bit IValue=Int32bit(floor(fValue));
                fValue-=IValue;
                m_Digits[i]=IValue;
    if (i==minsize-1)
    {
     if (fValue*emBase*2>=emBase)//四舍五入
     {
      m_Digits[i]+=1;
      for (int j=i;j>0;--j)
      {
       if  (m_Digits[j]>=emBase)//進位
       {
        m_Digits[j-1]+=1;
        m_Digits[j]-=emBase;
       }
       else
        break;
      }//for j
     }//if
    }//if
            }      
        }//for i
    } 
 Canonicity();
    return *this;
}


long double TLargeFloat::AsFloat() const
{
    //
    if ( ((m_Exponent.AsInt())>=emLongDoubleMaxExponent)
  ||((m_Exponent.AsInt())<=emLongDoubleMinExponent) )
 {
  throw TException("ERROR:TLargeFloat::AsFloat()");
 }

    if (m_Sign==0) return 0;
    long double result=m_Sign;
    result*=pow(10,double(m_Exponent.AsInt()));
    
    long double r=1;
    long double Sum=0;
 int m_CalcSize=m_Digits.size();
    for (int i=0;i<m_CalcSize;++i)//得到小數位
    {
        r/=emBase;
        if (r==0) break; 
        Sum+=(m_Digits[i]*r);
    }       
    return result*Sum;
}


void TLargeFloat::MoveLeft10Power(TMaxInt MoveCount)
{
    m_Exponent-=MoveCount;
    TMaxInt i=MoveCount/em10Power;
    TMaxInt iMoveCount= MoveCount%em10Power;
    
   //完成大的移動
 int m_CalcSize=m_Digits.size();
    if (i>=m_CalcSize)
    {
        Clear();
        return;
    }
    else if (i>0) //左移i
    {
        for (int j=0;j<m_CalcSize-i;++j)
            m_Digits[j]=m_Digits[int(j+i)];
        for (int k=int(m_CalcSize-i);k<m_CalcSize;++k)
            m_Digits[k]=0;
    }
    
    if (iMoveCount>0) //完成小的移動
    {
        int iMul=1;
        for (int k=0;k<iMoveCount;++k) iMul*=10;

  for (int i=m_CalcSize-1;i>=0;--i)
  {
   m_Digits[i]*=iMul;
  }
  for (int j=m_CalcSize-1;j>=1;--j)
  {
   if (m_Digits[j]>emBase)
   {
    m_Digits[j-1]+=m_Digits[j]/emBase;
    m_Digits[j]%=emBase;
   }
  }
    }
}

void TLargeFloat::MoveRight10Power(TMaxInt MoveCount)
{
    m_Exponent+=MoveCount;
    TMaxInt i=MoveCount/em10Power;
    TMaxInt iMoveCount= MoveCount%em10Power;
    
   //完成大的移動
 int m_CalcSize=m_Digits.size();
    if (i>=m_CalcSize)
    {
        Clear();
        return;
    }
    else if (i>0) //右移i
    {
        for (int j=m_CalcSize-1;j>=i;--j)
            m_Digits[j]=m_Digits[int(j-i)];
        for (int k=0;k<i;++k)
            m_Digits[k]=0;
    }
    if (iMoveCount>0) //完成小的移動
    {
        Int32bit iDiv=1;
        for (int j=0;j<iMoveCount;++j) iDiv*=10;
  
  for ( i=0;i<m_CalcSize-1;++i)
  {
   m_Digits[int(i)+1]+=(m_Digits[int(i)]%iDiv)*emBase;
   m_Digits[int(i)]/=iDiv;
  }
  if (m_CalcSize>=1)
   m_Digits[m_CalcSize-1]/=iDiv;
    }
}

void TLargeFloat::Canonicity()
{
    //規格化 小數部分
 //規格化的數滿足的條件:小數部分的值 小于1.0,大于等于0.1;

    if (m_Sign==0)
    {
        Clear();
        return;
    }

    int size=m_Digits.size();
    if (m_Digits[0]>=emBase)//是否需要右移1
    {
        m_Exponent+=em10Power;
        for (int j=size-1;j>=2;--j)
            m_Digits[j]=m_Digits[j-1];
        if (size>=2) m_Digits[1]=m_Digits[0] % emBase;
        m_Digits[0]/=emBase;
    }
 

    //考慮左移
    int i=0;
    int iMoveCount=0;
    for (;i<size;++i)//尋找第一個不為零的位i
    {
        if (m_Digits[i]>0)
  {
   Int32bit iBase=emBase;//iMoveCount 需要移動的十進制位數
   for (;iMoveCount<em10Power;++iMoveCount)
   {
    iBase/=10;
    if (m_Digits[i]>=iBase) break;
   }
   break;
  }
    }
    MoveLeft10Power(i*em10Power+iMoveCount);

}

std::string  TLargeFloat::DigitToString(Int32bit iDigit)
{
    char buffer[40];
 for (int j=0;j<40;++j) buffer[j]=0;
    _itoa(iDigit, buffer,10);
    std::string result(buffer);
 assert(em10Power>=result.size());
    result=std::string(em10Power-result.size(),'0')+result;
    return result;
}

std::string  TLargeFloat::AsString() const//轉換為字符串
{
 //沒有優化

    if (m_Sign==0)
        return "0";
    else 
    {
        std::string result;
        if  (m_Sign<0)
            result="-0.";
        else
            result="0.";
        int size=m_Digits.size();
        for (int i=0;i<size;++i)
        {
            result+=DigitToString(m_Digits[i]);
        }

        if (m_Exponent.AsInt()!=0)
        {
            result+='e';
            if (m_Exponent.AsInt()<0) result+='-';
            char buffer[40];
   //_i64toa(Private_::abs(m_Exponent.AsInt()), buffer,10);//__int64
   _itoa(Private_::abs(m_Exponent.AsInt()), buffer,10);
            result+=buffer;
        }
        return result;
    }
}


void TLargeFloat::Chs()//求負
{
    m_Sign*=(-1);
}

void TLargeFloat::Abs()//絕對值
{
    if (m_Sign!=0) m_Sign=1;
}


void TLargeFloat::swap(SelfType& Value)
{
    m_Digits.swap(Value.m_Digits);
 std::swap(m_Sign,Value.m_Sign);
    std::swap(m_Exponent,Value.m_Exponent);
}

//////////////
void TLargeFloat::toEqExponent(SelfType& x,SelfType& y)//對齊小數點
{
 ExpInt MoveCount=x.m_Exponent;
 MoveCount-=y.m_Exponent;
 if (MoveCount.AsInt()<0) MoveCount=ExpInt(-MoveCount.AsInt());
    if (x.m_Exponent.AsInt()>y.m_Exponent.AsInt())
    {
  y.MoveRight10Power(MoveCount.AsInt());
        y.m_Exponent=x.m_Exponent;
    }
    else if(x.m_Exponent.AsInt()<y.m_Exponent.AsInt())
    {
  x.MoveRight10Power(MoveCount.AsInt());
        x.m_Exponent=y.m_Exponent;
    }
}

void TLargeFloat::Abs_Add(const SelfType& Value)//絕對值加法
{
    SelfType Right(Value);
    Abs();
    Right.Abs();

    toEqExponent(Right,*this);//小數點對齊
    SetSameSizeMax(Right,*this);

 int m_CalcSize=m_Digits.size();
 
    m_Digits[0]+=Right.m_Digits[0];
    for (int j=m_CalcSize-1;j>=1;--j)
    {
        m_Digits[j]+=Right.m_Digits[j];
        if (m_Digits[j]>=emBase)//進位
        {
            m_Digits[j-1]+=1;
            m_Digits[j]-=emBase;
        }
    }

 if (m_Digits[0]>=emBase)
  Canonicity();

}

void TLargeFloat::Abs_Sub_Abs(const SelfType& Value)//絕對值減法
{

    SelfType Right(Value);
    Abs();
    Right.Abs();


    toEqExponent(Right,*this);//小數點對齊
    SetSameSizeMax(Right,*this);

    int comResult=Compare(Right);

    if (comResult==0)
    {
        Clear();
        return;
    }
    
 if (comResult<0)
        swap(Right);

 int m_CalcSize=m_Digits.size();
 for (int j=m_CalcSize-1;j>=0;--j)
    {
        m_Digits[j]-=Right.m_Digits[j];
  
  if (m_Digits[j]<0)//借位
  {
   m_Digits[j-1]-=1;//j-1不可能超界
   m_Digits[j]+=emBase;
  }
    
 }

 if (m_Digits[0]*10<emBase)
  Canonicity();
}

///////////////////

TLargeFloat::SelfType& TLargeFloat::operator += (const SelfType& Value)
{
 if (Value.m_Sign==0)
  return (*this);
 else if (m_Sign==0)
  return (*this)=Value;
 else if (m_Sign==Value.m_Sign)
    {
        Int32bit oldSign=m_Sign;
        Abs_Add(Value);
        m_Sign=oldSign;
    }
    else
    {
        SelfType x(Value);
        x.Chs();
        *this-=(x);
    }
    return *this;
}

TLargeFloat::SelfType& TLargeFloat::operator -= (const SelfType& Value)
{
 if (Value.m_Sign==0)
  return (*this);
 else if (m_Sign==0)
 {
  (*this)=Value;
  this->Chs();
  return (*this);
 }
    else if (m_Sign==Value.m_Sign)
    {
        int comResult=Compare(Value);    
        if (comResult==0)
        {
            Clear();
        }
        else
        {
            Abs_Sub_Abs(Value);
            m_Sign=comResult;
        } 
    }
    else
    {
        SelfType x(Value);
        x.Chs();
        *this+=(x);
    }
    return *this;
}


int  TLargeFloat::Compare(const SelfType& Value) const//*this>Value 返回1,小于返回-1,相等返回0
{
    //
    if (m_Sign>Value.m_Sign)
        return 1;
    else if(m_Sign<Value.m_Sign)
        return -1;
    else if(m_Sign==0)//m_Sign==Value.m_Sign
        return 0;

    //m_Sign==Value.m_Sign
    if (m_Exponent.AsInt()>Value.m_Exponent.AsInt())
    {
        if (m_Sign<0) 
            return -1;
        else
            return 1;
    }
    else if (m_Exponent.AsInt()<Value.m_Exponent.AsInt())
    {
        if (m_Sign<0) 
            return 1;
        else
            return -1;
    }
    else//(m_Exponent==Value.m_Exponent)
    {
        int sizeS=m_Digits.size();
        int sizeV=Value.m_Digits.size();
        int size=Private_::min(sizeS,sizeV);
        int result=0;
        for (int i=0;i<size;++i)
        {
            if (m_Digits[i]>Value.m_Digits[i])
            {
                result=1;
                break;
            }
            else if (m_Digits[i]<Value.m_Digits[i])
            {
                result=-1;
                break;
            }
        }
        if (result==0)
        {   //繼續比較 處理尾部
            if (sizeS>sizeV)
            {
                for (int i=sizeV;i<sizeS;++i) 
                {
                    if (m_Digits[i]>0)
                    {
                        result=1;
                        break;
                    }
                }
            }
            else if (sizeS<sizeV)
            {
                for (int i=sizeS;i<sizeV;++i) 
                {
                    if (Value.m_Digits[i]>0)
                    {
                        result=-1;
                        break;
                    }
                }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩绯色av一区二区在线观看| 日本一区二区免费在线| 91免费版在线| 日韩精品一区二区三区在线| 中文字幕一区三区| 日本一区二区高清| 亚洲综合色视频| 天天亚洲美女在线视频| 美女mm1313爽爽久久久蜜臀| 蜜桃一区二区三区在线| 成人av网站免费| 日韩西西人体444www| 欧美综合天天夜夜久久| 日韩一区二区三区视频在线| 国产视频一区二区在线| 亚洲va中文字幕| 成人免费视频视频在线观看免费| 在线观看日韩av先锋影音电影院| 久久亚洲二区三区| 青青草伊人久久| 99在线视频精品| 欧美精品丝袜中出| 亚洲黄色av一区| 99国产精品一区| 国产日产欧产精品推荐色| 香蕉成人啪国产精品视频综合网 | 一区二区三区日本| 欧美日本乱大交xxxxx| 亚洲乱码中文字幕综合| 国产精品123| 久久亚洲一区二区三区四区| 九九九久久久精品| 日韩欧美你懂的| 日本女优在线视频一区二区| 欧美色倩网站大全免费| 亚洲国产精品久久不卡毛片| 欧美日韩综合在线免费观看| 三级影片在线观看欧美日韩一区二区| 国产成人精品三级| 最新国产成人在线观看| 91丨九色丨国产丨porny| 亚洲人吸女人奶水| 欧美日韩国产精选| 久久福利资源站| 国产精品久久久久久久久果冻传媒| 成人在线视频一区| 亚洲亚洲人成综合网络| 这里只有精品电影| 成人精品在线视频观看| 亚洲成av人影院在线观看网| 日韩精品中文字幕一区二区三区 | 欧美日韩成人一区二区| 激情另类小说区图片区视频区| 久久影音资源网| 欧美少妇bbb| 国产99精品在线观看| 亚洲成人午夜电影| 国产欧美日韩精品一区| 制服丝袜日韩国产| 色综合久久88色综合天天免费| 久久99久久99小草精品免视看| 亚洲欧美综合色| 26uuu精品一区二区在线观看| 波多野结衣欧美| 国产精品亚洲一区二区三区在线 | 国产成人久久精品77777最新版本| 国产精品久久99| 久久精品视频在线免费观看| 欧美三级韩国三级日本三斤| av中文字幕不卡| 麻豆91精品91久久久的内涵| 日本中文字幕一区二区有限公司| 中文字幕精品在线不卡| 久久免费看少妇高潮| 91精品国产91久久久久久最新毛片| 欧洲一区二区三区在线| 大胆亚洲人体视频| 国产成a人亚洲| 国产成人av影院| 成人午夜av影视| av日韩在线网站| 色噜噜久久综合| 欧美午夜不卡在线观看免费| 欧美性三三影院| 91精品蜜臀在线一区尤物| 欧美人与性动xxxx| 欧美一区二区三区系列电影| 精品欧美黑人一区二区三区| 欧美大片日本大片免费观看| 国产视频不卡一区| 最新中文字幕一区二区三区| 中文字幕字幕中文在线中不卡视频| 亚洲欧美色图小说| 日韩专区一卡二卡| 国产一区中文字幕| 欧美午夜精品久久久久久孕妇| 欧美人妖巨大在线| 亚洲国产成人私人影院tom| 亚洲美女视频在线观看| 男女视频一区二区| 色av成人天堂桃色av| 欧美一区二区三区色| 亚洲女同一区二区| 久久99精品久久久| 欧美精品一区二区三区在线 | 亚洲国产综合在线| 国产mv日韩mv欧美| 欧美一区二区成人| 亚洲成人中文在线| 国产91丝袜在线播放0| 欧美日韩国产高清一区二区三区 | 福利一区二区在线观看| 欧美va在线播放| 午夜伦理一区二区| 欧美私人免费视频| 亚洲在线观看免费| 欧美亚洲动漫精品| 亚洲色大成网站www久久九九| 成人网男人的天堂| 欧美国产日本韩| 国产v综合v亚洲欧| 中文字幕精品三区| 成人av免费网站| 亚洲色图清纯唯美| 一本大道综合伊人精品热热| 国产精品久久夜| www.亚洲激情.com| 亚洲免费电影在线| 欧美日韩大陆在线| 精品无码三级在线观看视频| 亚洲精品一线二线三线无人区| 国产精品69毛片高清亚洲| 国产日韩欧美激情| 97精品久久久午夜一区二区三区| 亚洲少妇中出一区| 在线综合+亚洲+欧美中文字幕| 免费黄网站欧美| 中文字幕中文字幕一区二区| 91在线视频网址| 日本午夜精品视频在线观看| 欧美极品aⅴ影院| 欧美日韩国产小视频在线观看| 亚洲午夜久久久久久久久久久 | 久久精工是国产品牌吗| 成人欧美一区二区三区黑人麻豆 | 又紧又大又爽精品一区二区| 精品日韩欧美在线| 色成年激情久久综合| 国产精品资源网站| 日韩中文字幕91| 国产精品进线69影院| 欧美tk丨vk视频| 欧美一区二区女人| 91性感美女视频| 国产91精品久久久久久久网曝门| 日韩黄色一级片| 亚洲另类色综合网站| 国产精品毛片无遮挡高清| 日韩免费在线观看| 欧美另类久久久品| 在线观看欧美精品| 99久久精品免费| 波多野结衣亚洲| 色综合久久99| 日本道精品一区二区三区| 粉嫩av一区二区三区在线播放 | 国产精品理伦片| 中文字幕av在线一区二区三区| 久久久天堂av| 久久久国产综合精品女国产盗摄| 精品国产乱子伦一区| 精品久久久久久久一区二区蜜臀| 久久综合五月天婷婷伊人| 精品久久一区二区三区| 久久精品一区蜜桃臀影院| 国产婷婷色一区二区三区四区| 久久精品亚洲麻豆av一区二区| 国产嫩草影院久久久久| 中文字幕在线观看不卡| 亚洲免费成人av| 美女久久久精品| 成人免费观看av| 91麻豆精品国产91久久久| 26uuu精品一区二区三区四区在线| 久久久www成人免费毛片麻豆| 国产精品久久免费看| 午夜电影久久久| 国产成人精品影视| 欧美日韩免费电影| 国产午夜精品一区二区三区四区| 中文字幕在线一区| 麻豆视频一区二区| 成人av电影免费观看| 日韩欧美国产综合| 亚洲欧美另类久久久精品2019| 日韩国产在线观看| 日本福利一区二区| 国产精品美女久久久久高潮| 国产一区二区不卡老阿姨| 欧美乱妇23p|