编程语言
首页 > 编程语言> > Java自定义数字接口-平方根

Java自定义数字接口-平方根

作者:互联网

问题在于在通用数值接口中定义平方根算法的策略方法.我知道存在各种条件下解决问题的算法.我对以下算法感兴趣:

>仅使用选定的功能解决问题;
>不在乎被操纵的对象是整数,浮点数还是其他对象,只要可以添加,将其多样化和面对这些对象即可;
>如果输入是一个完美的正方形,则返回精确的解决方案.

由于区分的微妙性和清晰起见,我将以非常冗长的方式定义问题.当心墙上的文字!

假设具有Java接口,常量C将常量C扩展为常量C.使用以下抽象方法,我们将调用基本函数:

> C add(C a);
> C减去(C a);
> C乘法(C a);
> C [] dividAndRemainder(C b);
> C添加剂Inverse();
> C multiplicativeInverse();
> CAdditiveIdentity();
> C multiplicativeIdentity();
> int compareTo(C arg1);

不知道C是代表整数还是浮点数,在下面的讨论中这也没有关系.

仅使用那些方法就可以创建一些关于数字的数学算法的静态或默认实现:例如,dividerAndRemainder(C b);和compareTo(C arg1);允许为更大的公约数,bezout身份等创建算法…

现在假设我们的接口具有默认的求幂方法:

public default C pow(int n){
    if(n <  0) return this.additiveInverse().pow(-n);
    if(n == 0) return additiveIdentity();
    int m = n;
    C output = this;
    while(m > 1)
        {
        if(m%2 == 0)  output = output.multiply(output);
        else          output = this.multiply(output.multiply(output));
        m = m/2;
        }
    return output;
    }

目标是定义两个默认方法,称为C root(int n)和C maximumErrorAllowed()这样:

> x.equals(y.pow(n))意味着x.root(n).equals(y);
> C根(int n);实际上仅使用基本函数和从基本函数创建的方法来实现;
>接口仍然可以应用于任何类型的数字,包括但不限于整数和浮点数.
> this.root(n).pow(n).compareTo(maximumErrorAllowed())== -1,使得this.root(n)!= null,即所有最终近似值的误差都小于C maximumErrorAllowed( );

那可能吗?如果是,对计算复杂度的估计如何以及将是什么?

解决方法:

我花了一些时间在Java的自定义数字接口上工作,这非常困难,这是我在Java上最令人失望的经历之一.

问题是您必须从头开始-您无法真正重用Java中的任何内容,因此,如果要使用int,float,long,BigInteger,有理数,Complex和Vector的实现,则必须实现每个类自己使用所有方法,然后不要指望Math包有很大帮助.

实现“复合”类(例如由两个“泛型”浮点类型组成的“复杂”或由两个泛型整数类型组成的“有理”类)特别讨厌.

数学运算符是正确的-这可能尤其令人沮丧.

使它正常运行的方法是用Java实现类,然后用Groovy编写一些更高层次的东西.如果正确命名操作,Groovy可以选择它们,就像您的类实现了“ .plus()”一样,那么groovy可以让您执行instance1 instance2.

由于IIRC是动态的,因此Groovy经常会很好地处理跨类的片断,就像您说过Complex Integer一样,您可以提供从Integer到Complex的转换,而Groovy会促使Integer到Complex进行操作并返回一个Complex.

Groovy与Java可以互换,您通常可以将Java类“ .groovy”重命名并进行编译,然后便可以正常工作,因此这是一个很好的折衷方案.

但是,这是很久以前的事了,现在您可能会在“ Number”接口中使用Java 8的默认方法,这可能使某些类更容易实现,但可能无济于事,我不得不再次尝试一下找出来,我不确定我是否想重新打开那些可能会蠕虫的东西.

标签:java,numerical-methods
来源: https://codeday.me/bug/20191119/2035460.html