难道Java的有什么表示无穷,每数值数据类型? 它是如何实现的,这样我可以做数学运算呢?
如
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
我一直在使用非常大的数字试过,但我希望有一个合适的, 简单的解决方案。
难道Java的有什么表示无穷,每数值数据类型? 它是如何实现的,这样我可以做数学运算呢?
如
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
我一直在使用非常大的数字试过,但我希望有一个合适的, 简单的解决方案。
double
支持无限
double inf = Double.POSITIVE_INFINITY;
System.out.println(inf + 5);
System.out.println(inf - inf); // same as Double.NaN
System.out.println(inf * -1); // same as Double.NEGATIVE_INFINITY
版画
Infinity
NaN
-Infinity
注意: Infinity - Infinity
不是一个数字 。
我假设你正在使用整数运算的一个原因。 如果是这样,你可以得到一个结果,这是功能上几乎与使用的MAX_VALUE领域POSITIVE_INFINITY Integer
类:
Integer myInf = Integer.MAX_VALUE;
(以及NEGATIVE_INFINITY你可以使用MIN_VALUE。)当然会有一些功能上的差异,例如,比较时myInf
到恰好是MAX_VALUE的值:显然这个数不小于myInf
。
还有一个图书馆 ,实际上有场POSITIVE_INFINITY和NEGATIVE_INFINITY,但他们是真正为MAX_VALUE和MIN_VALUE只是新的名称。
要使用Infinity
,你可以使用Double
支持Infinity
: -
System.out.println(Double.POSITIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY * -1);
System.out.println(Double.NEGATIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY);
输出 : -
Infinity
-Infinity
-Infinity
Infinity
NaN
在Double
和Float
类型有POSITIVE_INFINITY
不变。
我不知道Java有无穷的每一个数值类型,但由于某种数值数据类型的答案是肯定的:
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
要么
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
你还可以找到有用下面的文章表示,涉及+/-无穷大一些数学运算: Java的浮点数余光中 。
只有double和float类型支持POSITIVE_INFINITY
不变。
对于数值包装类型。
例如Double.POSITVE_INFINITY
希望这可以帮助你。
一个通用的解决方案是引入一个新类型。 这可能是更复杂,但它对于任何类型的没有定义自己的无限合作的优势。
如果T
是需要类型lteq
被定义,可以定义InfiniteOr<T>
与lteq
是这样的:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
我要把它留给你把这种苛求的Java语法。 我希望的想法是明确的; 但让我拼出来反正。
我们的想法是创建一个新的类型,其具有所有的相同的价值观一些已经存在的类型,再加上一个特殊值,只要你可以通过public方法,行为告诉正是你想要无限行事的方式,例如,它是大于还要别的吗。 我使用的是null
在这里表示无穷大,因为这似乎是最简单的Java编写的。
如果你想添加的算术运算,决定他们应该做的事情,然后实现。 如果你处理了无限的情况下,再重新使用原始类型的有限值的现有业务这可能是最简单的。
有可能会或可能不会是它是否很有好处采用的前右手边无穷大,反之亦然处理左手端无穷公约的一般模式; 我不能说没有想出来,但低于或相等( lteq
)我认为这是简单的右手边无穷先看看。 我注意到, lteq
是不可交换的,但add
和mul
的; 也许这是相关的。
注:想出应该发生在无限的价值是什么一个很好的定义并不容易。 这是一个比较加法和乘法,但也许不是减法。 此外,还有无限的基数,哪些是你可能要注意序数之间的区别。
由于类号是不是终点,这里是一个想法,我没有在其他职位找到呢。 即子类类数。
这会在一定程度交付可视为无穷大的整数,长,双,浮法,BigInteger和BigDecimal的对象。
由于只有两个值,我们可以使用Singleton模式:
public final class Infinity extends Number {
public final static Infinity POSITIVE = new Infinity(false);
public final static Infinity NEGATIVE = new Infinity(true);
private boolean negative;
private Infinity(boolean n) {
negative = n;
}
}
不知怎的,我觉得其余的方法的intValue()的longValue()等。然后应该重写抛出异常。 所以不能没有进一步的预防措施,使用的无穷价值。