zoukankan      html  css  js  c++  java
  • Java实现开根号运算(不使用数组和String)

    使用Java自己实现开根号运算,网上也有不少代码,多数都使用String或者数组。这里写一段只使用double基础数据类型实现的方法。

        private static double sqrt(int n, int p) {
            double lower = 0;
            while (lower * lower < n) {
                lower++;
            }
            --lower;
    
            int flag = 1;
            int d = 10;
            while (flag <= p + 1) {
                d = 10;
                for (int x = 1; x < flag; x++) {
                    d = d * 10;
                }
                double step = 1.d / d;
                for (int i = 0; i < 10; i++) {
                    if (lower * lower > n) {
                        break;
                    }
                    lower = lower + step;
                }
                lower = lower - step;
    
                flag++;
            }
    
            double v1 = lower * (d * 10);
            int v = ((int) v1 % 100) / 10;
            double res;
            if (v < 5) {
                res = (lower * d - v) / d;
            } else {
                res = (lower * d - v + 10) / d;
            }
            return res;
        }
    

    参数中n是整数,p是精度。这种程序一般不能支持特别高的精度(比如几十位),五六位就不错了。

    代码原理简单,这里就不说了。先看一下输出:

        public static void main(String[] args) {
            System.out.println("2 1 = " + sqrt(2, 1));
            System.out.println("2 2 = " + sqrt(2, 2));
            System.out.println("2 3 = " + sqrt(2, 3));
            System.out.println("2 4 = " + sqrt(2, 4));
            System.out.println("3 2 = " + sqrt(3, 2));
            System.out.println("3 3 = " + sqrt(3, 3));
            System.out.println("25 4 = " + sqrt(25, 4));
            System.out.println("25 6 = " + sqrt(25, 6));
        }
    

    输出

    2 1 = 1.4000000000000004
    2 2 = 1.41
    2 3 = 1.414
    2 4 = 1.4142
    3 2 = 1.7300000000000004
    3 3 = 1.7320000000000004
    25 4 = 5.0000099999999925
    25 6 = 5.000000099999996

    由于double精度的问题,输出并不完全满足要求,当需要几位精度的时候要截取前几位。

    另外,当输入的整数比较大的时候,精度丢失也比较快:

    2500 5 = 50.00000000000001
    2500 6 = 49.999999500000015
    25 6 = 5.000000099999996
    25 7 = 4.999999949999996

    可以看到给25开根号6位精度还行,给2500开的话,6位精度已经不能保证了。


    上面的代码在while确定整数部分的时候可以优化,并不需要把所有小于平方根的数都过滤一遍。读者可以尝试一下。

  • 相关阅读:
    jmeter之三种参数化
    linux(centos6.5)常用命令
    win10+jdk+mysql+tomcat+jpress环境搭建与部署
    [剑指Offer] 29.最小的K个数
    [C/C++] C++中new的语法规则
    [C/C++] 深拷贝和浅拷贝
    [C/C++] #ifdef和#endif
    [C/C++] C++声明和定义的区别
    [C/C++] extern关键字详解以及与static、const区别
    [C/C++] static在C和C++中的用法和区别
  • 原文地址:https://www.cnblogs.com/somefuture/p/13821897.html
Copyright © 2011-2022 走看看