計算精度について

3578 ワード

本文はSam私がまとめたもので、C++学習の過程でよく見られる計算精度に関する問題は、明察秋毫の作と言える.
 
1.計算プロセスは高精度タイプ(doubleなど)を使用し、最終結果をintに変換するなど、最終的なステップで完了します.
 
例:(最小乗算回数、C++)
/*
    :

        ,       n  ,              ,         。
 24:2*2=22(    ),22*22=24(    ),     2 。
  211:2*2=22(    ),22*22=24(    )24*24=28(    )28*22=210(    )210*21=211(    )     5 。

  
   m   m(1<=m<=100)     ;
           n(0<n<=10000);
 
  
            s;

    
3
2
3
4

    
1
2
2

-----------------------------------------------------------------

    :

        n    2k  , 11,  23=8,      。

           。

                   。      1        ,           1     。  :
(14)10=(1110)2
    1    3 ,    14    3+2(   1   )=5 。
(100)10=(1100100)2
    1    6 ,    100    6+2(   1   )=8 。

          1     。(2        !)        1,    1       。      1   1+1=2 2+2=4 4+4=8 8+8=16……    ,           ,   1             。(    )
*/
#include <iostream>
#include <cmath>
using namespace std;

int countOne(int n){
    int cnt=0;
    while(n>0){
        n-=(n&(-n));
        cnt++;
    }
    return cnt;
}

int main(){

    int cases;
    cin>>cases;
    
    while(cases--){
        int n;
        cin>>n;
        
        //      :
        //          double,       int  .
        //               int
         
        cout<< log((double)n)/log(2.0) + countOne(n)-1 <<endl;  // n=8 ,  3(  ) 
        
        //cout<< (int)( log((double)n)/log(2.0)) + countOne(n)-1<<endl;  // n=8 ,  2(  )
    }

    system("pause");
    return 0;
}
 
2.無限反復、収束するかどうかを判断する:最小誤差項epsを導入する
 
例:(テイラー級数計算正弦波値,C++)
/*
      (Taylor)     ,      sin(x)=x – ((x^3)/3!) + ((x^5)/5!) – ((x^7)/7!) + ((x^9)/9!) - ……
       ,    0-360 (       ),   sin 。
*/
#include <iostream>
using namespace std;

const double eps=1e-15; //     
const double pi=3.14159265358979323846;

int main(){
    double angle;    //  
    double x;         //(  )   
    double ans1, ans2;      //ans1:     , ans2:    
    double numerator;       //  
    double denominator;     //  
    
    cout<<"Please input the angle: ";
    cin>>angle;
    x=angle/180*pi;
    
    //    ,    do...while()  ,          ,     
    ans1=x;
    numerator=x;
    denominator=1.0;
    
    int i=2;
    do{
        ans2=ans1;
        numerator*=-x*x;
        denominator*=( i*(i+1) );
        
        ans1=ans2+ numerator/denominator;
        
        i+=2;
    }while(ans1-ans2>eps || ans2-ans1>eps);
    
    //cout<<"res="<<ans1<<endl;
    printf("sin(%.2lf) = %.6lf
",angle, ans1); system("pause"); return 0; }

 
3.doubleタイプ指定精度出力
 
例:(前例、C++)
double angle=...
double ans1=...

//    w  double    : printf("%.wlf",d);
printf("sin(%.2lf) = %.6lf
",angle, ans1);