Java是否有能代表每种数值数据类型的无穷大?它是如何实现的,以便我可以用它进行数学运算?
E.g。
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
我尝试使用非常大的数字,但我想要一个正确的,简单解决方案。
答案 0 :(得分:165)
double
支持Infinity
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
不是数字。
答案 1 :(得分:30)
我假设您使用整数数学是有原因的。如果是这样,您可以使用Integer
类的MAX_VALUE字段获得与POSITIVE_INFINITY功能几乎相同的结果:
Integer myInf = Integer.MAX_VALUE;
(对于NEGATIVE_INFINITY,您可以使用MIN_VALUE。)当然会有一些功能差异,例如,将myInf
与恰好是MAX_VALUE的值进行比较时:显然这个数字不小于{{ 1}}。
还有a library实际上有字段POSITIVE_INFINITY和NEGATIVE_INFINITY,但它们实际上只是MAX_VALUE和MIN_VALUE的新名称。
答案 2 :(得分:11)
要使用Infinity
,您可以使用支持Double
的{{1}}: -
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);
答案 3 :(得分:5)
Double
和Float
类型的POSITIVE_INFINITY
常量。
答案 4 :(得分:4)
我不确定Java是否具有每种数值类型的无穷大,但对于某些数值数据类型,答案是肯定的:
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
或
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
另外,您可能会发现以下文章有用,它代表了涉及+/-无穷大的一些数学运算:Java Floating-Point Number Intricacies。
答案 5 :(得分:3)
只有Double和Float类型支持POSITIVE_INFINITY
常量。
答案 6 :(得分:2)
对于数字包装器类型。
例如Double.POSITVE_INFINITY
希望这对你有所帮助。
答案 7 :(得分:2)
通用解决方案是引入新类型。它可能涉及更多,但它具有为任何未定义其自身无穷大的类型工作的优势。
如果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语法。我希望这些想法很清楚;但是让我把它拼出来。
我们的想法是创建一个新类型,它具有与某些已存在的类型相同的值,加上一个特殊值 - 就您可以通过公共方法告知的那样 - 完全按照您希望无穷大行动的方式行动,例如:它比什么都重要。我在这里使用null
来表示无穷大,因为这似乎是Java中最直接的。
如果要添加算术运算,请确定它们应该做什么,然后实现它。如果你先处理无限的情况,然后在原始类型的有限值上重复使用现有的操作,这可能是最简单的。
在右手无穷大之前采用处理左手无穷大的惯例是否有可能或可能没有一般性模式,反之亦然;我不知道如果不尝试它,但是对于小于或等于(lteq
)我认为首先看右手无限是更简单的。我注意到lteq
不是可交换,但add
和mul
是;也许这是相关的。
注意:想出对无限值应该发生什么的一个很好的定义并不总是那么容易。它用于比较,加法和乘法,但可能不是减法。此外,您可能需要注意的无限基数和序数之间存在区别。
答案 8 :(得分:0)
由于课程号不是最终的,所以这里是 想法,在其他帖子中找不到。 即为类Number的子类。
这将以某种方式交付可以被处理的对象 作为Integer,Long,Double,Float, BigInteger和BigDecimal。
由于只有两个值,我们可以使用单例模式:
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() 等。然后应重写以引发异常。以便 没有进一步的预防措施,就无法使用无穷大值。
答案 9 :(得分:0)
我是Java的初学者...
我在Java文档中找到了针对boolean
和double
类型的无穷大的另一种实现。
https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3
正零和负零比较相等;因此,结果 表达式0.0 ==-0.0为true,而0.0> -0.0的结果为false。但 其他运算可以区分正零和负零;对于 例如,1.0 / 0.0的值为正无穷大,而 1.0 / -0.0是负无穷大。
它看起来很丑,但是可以用。
public class Main {
public static void main(String[] args) {
System.out.println(1.0/0.0);
System.out.println(-1.0/0.0);
}
}
答案 10 :(得分:0)
整数无穷大:
Integer maxNumber = Integer.MAX_VALUE
双无穷
Double maxNumber = Double.MAX_VALUE;
Double positiveInf = Double.POSITIVE_INFINITY;
Double negativeInf = Double.NEGATIVE_INFINITY
浮动无穷
Float positiveInf = Float.POSITIVE_INFINITY;
Float negativeInf = Float.NEGATIVE_INFINITY
Float maxNumber = Float.MAX_VALUE;