ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 11:04:35  阅读:236  来源: 互联网

标签:java numerical-methods


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

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

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

假设具有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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有