• 葡萄城设计竞赛


                            科学计算器

    一开发平台

      基于windows 7 +Eclipse开发。採用Java语言编码。

     

    二模块及算法

      软件简单介绍:自己主动解析计算表达式。并进行运算返回结果的一个科学计算器程序。

     

      ①输入和输出 

        科学计算器的输入为一个类似于“SQRT(1+2)”形式的表达式的字符串,该输入相应的    运算结果为3的平方根。输出结果为一个表示运算结果的字符串。比方说  “1.7320508075688773” 

      ②关于输入 

       输入表达式包括下面类型: 数值常量 。运算符号 。数值常量 包括正数和负数。 

        运算符号 

        支持普通的四则运算符号,包含+-*/,分别相应加减乘除运算 

        支持模除和乘方运算符号。形如 ”x mod y” 以及 “x ^ y”。 

    支持括号运算符,用作改变运算优先级。比如 ”1 * (2 + 4)” 

    数组仅作为參数形式出如今函数參数中,数组由一组数值常量或者

        表达式组成。由逗号”,” 分隔。并使用方括号”[]”做为数组的界限标记。

      ③功能函数

       1.三角函数,双曲函数和反三角函数 

           public static double sin(doubie a)//返回角的三角正弦

           public static double cos(doubie a)//返回角的三角余弦

           public static double tan(doubie a)//返回角的三角正切

           public static double asin(doubie a)//返回一个值的反正弦

           public static double acos(doubie a)//返回一个值的反余弦

           public static double atan(doubie a)//返回一个值的反正切

           public static double toRadians(doubie angdeg)//将角度转换为弧度

           public static double toDegrees(doubie angrad)//将弧度转换为角度

     

    · 2.模除运算 

         

    Java中模运算是用一个操作数-还有一个操作数,直到前面的操作数值小于后一个操      作数值为止。//10-2.1 ——》7.9-2.1——》5.8-2.1——》3.7-2.1——》1.6。 结果为1.6  System.out.println(10%2.1); Java中。模运算的符号位取决于前一 个操作数,无论后一个操作数的符号 结构为:前一个操作数的符号 前一个操作数 的绝对值%后一个操作数的绝对值 System.out.println(10%-3);   //1   System.out.println(-10%-3);  //-1  

      3 指数运算

          int y=1,i=0;
          if(b=0)
          y=1;
          for(i=1;i<=b;i++)
          y=y*x;
          printf("y=%d ",y);

    ·4.开方运算 

         BigInteger b=new BigInteger(num);

      

      if(b.compareTo(BigInteger.ZERO)<0)

      return "不是正数";

      String sqrt="0"; //开方结果

      String pre="0"; //开方过程中须要计算的被减数

      BigInteger trynum; //试商,开放过程中须要计算的减数

      BigInteger flag;  //试商,得到满足要求减数的之后一个数

      BigInteger twenty=new BigInteger("20"); //就是20

      BigInteger dividend; ///开方过程中须要计算的被减数

      int len=num.length(); //数字的长度

      if(len%2==0) //长度为偶数

      {

      for(int i=0;i<len/2;++i) //得到的平方根一定是len/2位

      {

      dividend=new BigInteger(pre+num.substring(2*i,2*i+2));

      for(int j=0;j<=9;++j)

      {

      trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+"")));

      flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));;

      //满足要求的j使得试商与计算中的被减数之差为最小正数

      if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0

      &&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0)

      {

      sqrt+=j;  //结果加上得到的j

      pre=dividend.subtract(trynum).toString(); //更新开方过程中须要计算的被减数

      break;

      }

     

       5.求给定值 x 的经常使用对数:log10(x) 

    ·   求给定值 x 的自然对数:ln(x) 

         logx(y) =loge(x) / loge(y)
        public double log(double value, double base) {
           return Math.log(value) / Math.log(base);
       }
      计算100的以10为底的对数就变为很easy了:
      double log = Logarithm.log(100, 10); // log is 2.0
       512的以2为底的对数是:
       double log = Logarithm.log(512, 2); // log is 9.0
      
      static public double log2(double value) {
       return log(value, 2.0);
       }
       static public double log10(double value) {
       return log(value, 10.0);
       } 

       6.阶乘运算

    java中提供了两个拥有高精度计算了类:BigInteger和BigDecimal

     

    BigInteger:支持随意精度的整数运算

     

    BigDecimal:支持随意精度的定点数。能够进行精确的货币计算

    for (int i = 1; i <= SUM; i++) {

                  // new BigDecimal("乘数").multiply(new BigDecimal(“因子 ")).toString();

    BigDecimal   stra =new BigDecimal(s);

    BigDecimal end = new BigDecimal(s); //将s转为BigDecimal

    BigDecimal re = end.multiply(stra); //end*stra

    s = re.toString(); //又一次赋值给s

     

    统计函数 

    · 

     集合的算术平均值:avg([…]) 

    集合的统计:sum([…]) 

     while(reader.hasNextDouble()){  

            double x=reader.nextDouble();  

            try{  

                if(x<0||x>100)  

                x=Integer.parseInt("x<0||x>100");  

                else{  

                    m=m+1;  

                    sum=sum+x;  

                }  

            }  

     

    · 

    · 集合的估算方差:var([…]) 

    · 集合的整体方差:varp([…]) 

       由于样本的个数总是的在不断变化的。确切将是不断递增;假设每次添加,都要又一次计算平均值。再按次公式,计算出方差;通过n-1个样本时的方差值。和新增的样本,就能得到此时这N个样本的方差;这样计算量不会变同一时候保持在一个非常小的值。可大大提高程序的计算效率。递推公式例如以下:

          Mn = Mn-1+ (xn - Mn-1)/n


          Sn = Sn-1 + (xn - Mn-1)*(xn - Mn)

          Mn为平均值,初始时: M1 = x1,  S1 = 0 (此等式的推导证明,我后面给出),而样本方差 s =Sn/(n - 1)

     private int count;// 样本的个数 

        private double mk;// 平均值 

    06     private double sk;// Sn 

    07     private double runVar;// 样本方差 

    08   

    09     public RunningVariance() { 

    10         this(0, 0.0, 0.0); 

    11     } 

    12   

    13     public RunningVariance(int count, double mk, double sk) { 

    14         this.count = count; 

    15         this.mk = mk; 

    16         this.sk = sk; 

    17         recomputeRunVar(); 

    18     } 

    19   

    20     public double getMk() { 

    21         return mk; 

    22     } 

    23   

    24     public double getSk() { 

    25         return sk; 

    26     } 

    27   

    28   

    29      * 获取执行时样本方差 

    30    

    31     

    32      

    33     public synchronized double getRunningVariance() { 

    34         return runVar; 

    35     } 

    36   

    37   

    38    添加样本 

    39    

    40     

    41     

    42     public synchronized void addSample(double sample) { 

    43         if (++count == 1) { 

    44             mk = sample; 

    45             sk = 0.0; 

    46         } else { 

    47             double oldmk = mk; 

    48             double diff = sample - oldmk; 

    49             mk += diff / count; 

    50             sk += diff * (sample - mk); 

    51         } 

    52         recomputeRunVar(); 

    53     } 

    54   

    55  

    56       移除样本 

    57        

    58      

    59      

    60     public synchronized void removeSample(double sample) { 

    61         int oldCount = getCount(); 

    62         double oldmk = mk; 

    63         if (oldCount == 0) { 

    64             throw new IllegalStateException(); 

    65         } 

    66         if (--count == 0) { 

    67             mk = Double.NaN; 

    68             sk = Double.NaN; 

    69         } else { 

    70             mk = (oldCount * oldmk - sample) / (oldCount - 1); 

    71             sk -= (sample - mk) * (sample - oldmk); 

    72         } 

    73         recomputeRunVar(); 

    74     } 

    75   

    76     private synchronized void recomputeRunVar() { 

    77         int count = getCount(); 

    78         runVar = count > 1 ?

     sk / (count - 1) : Double.NaN; 

    79         // 若须要计算标准差 

    80         // runVar = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN; 

    81     } 

    82   

    83     public synchronized int getCount() { 

    84         return count; 

    85     } 

     

    · 集合的估算标准差:stdev([…]) 

    · 集合的整体标准偏差:stdevp([…]) 

       中间数据缓存器MC/MR/MS/M+/M-:M表示Memory。是指一个中间数据缓存器,MC=Memory Clear, MR=Memory Read, MS=Memory Save, M+=Memory Add, M-=Memory inus。能够用一个样例来演示:(7-2) * (8-2)= 先输入7。按MS保存,输入2,按M-与缓存器中的7相减,此时缓存器中的值为5;然后计算8-2,得出结果为6。输入*相乘,按MR读出之前保存的数5。按=得出结果30,算完后按MC清除缓存器

    统计模式,这是一种全然不同的计算模式,你不再逐次的输入数据与操作符而得到一个结果,而是先输入一系列已知的数据。然后计算各种统计数据(注意,这里清除之前输入的一组数据的button为CAD)。支持的统计数据包含平均值、平方平均值。和,平方和,还有就是标准差(standard deviation),标准差是方差的平方根,用来表示一组数据的离散程度。

    这里提供了两种标准差的计算方式:

    :整体标准差(population standard deviation)。其在计算方差的过程其中是除以n的。

    :样本标准差(sample standard deviation),其在计算方差的过程中式除以n-1的

     

      

     

       

      

     

     

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    使用pull解析XML文件
    使用Pull解析器生成XML文件
    Android下文件访问的权限
    Android之SharedPreference存储数据
    Android之外部存储(SD卡)
    Android的内部存储
    Android数据存储的方式
    点击事件的四种写法
    Context
    EclipseADT编写单元测试代码的步骤
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4823429.html
Copyright © 2020-2023  润新知