Math 整数除零和浮点(实数)除零

Math 整数除零和浮点(实数)除零,math,language-agnostic,divide-by-zero,Math,Language Agnostic,Divide By Zero,如果我运行下面一行代码,我会得到被零除的错误 1. System.out.println(5/0); 这是预期的行为 现在我运行下面一行代码 2. System.out.println(5/0F); 这里没有被零除的错误,而是显示了无限 第一行是两个整数的除法,第二行是两个实数的除法 为什么整数被零除会产生被零除的错误,而实数则是无穷大 我确信它不是特定于任何编程语言的。(编辑:这个问题已经改变了一点——它在某一点上特别提到了Java。) Java中的整数类型没有无穷大、“非数字”值等表示形

如果我运行下面一行代码,我会得到被零除的
错误

1. System.out.println(5/0);
这是预期的行为

现在我运行下面一行代码

2. System.out.println(5/0F);
这里没有被零除的
错误,而是显示了
无限

第一行是两个整数的除法,第二行是两个实数的除法

为什么整数被零除会产生被零除的错误,而实数则是无穷大

我确信它不是特定于任何编程语言的。

(编辑:这个问题已经改变了一点——它在某一点上特别提到了Java。)

Java中的整数类型没有无穷大、“非数字”值等表示形式,而IEEE-754浮点类型,如
float
double
则有。就这么简单,真的。它实际上不是“实数”与“整数”之差——例如,
BigDecimal
也表示实数,但它也没有无穷大的表示

编辑:要清楚地说,这是特定于语言/平台的,因为您可以创建自己的语言/平台,它的工作方式不同。然而,底层CPU通常以相同的方式工作——因此您会发现许多语言都是这样工作的

编辑:在动机方面,请记住,特别是对于无穷大的情况,有一些不被零除而达到无穷大的方法,比如被一个非常非常小的浮点数除。在整数的情况下,在0和1之间显然没有什么

还请记住,使用整数(或十进制浮点类型)的情况通常不需要考虑无穷大或“非数字”结果的概念,而在科学应用中(其中,
float
/
double
更为常用),“无穷大”(或至少,“太大而无法合理表示的数字”)仍然是一个潜在的有效结果。

这是特定于一种编程语言或一系列语言的。并非所有语言都允许在同一表达式中使用整数和浮点数。并非所有语言都具有这两种类型(例如,像JavaScript这样的ECMAScript实现在外部没有整数类型的概念)

但是,整数算术浮点算术之间存在本质区别。在整数算术中,必须定义零除是错误的,因为没有值来表示结果。在浮点算术中,特别是在IEEE-754中定义的浮点算术中,有额外的无穷大的数学概念和NaN(不是数字)等元概念的自变量值(符号位、指数和尾数的组合)

因此,我们可以假设此编程语言中的
/
运算符是泛型的,如果两个操作数都是该语言的整数类型,它将执行整数除法;如果至少一个操作数是该语言的浮点类型,它将执行浮点除法,而其他操作数将隐式转换d)为了操作的目的,将其转换为该浮动类型

在实数数学中,将一个数除以一个接近零的数相当于将第一个数乘以一个绝对值非常大的数(x/(1/y)=x*y)。因此,被零除的结果应该是(定义为)无穷大,因为将超过浮点值的精度


实现细节可以在该编程语言的规范中找到。

如果我们用C语言运行一个类似的程序,结果将是类似的。因此,它与Java无关。它与数字的表示方式有关。Jon和往常一样,对此非常感兴趣。你真的有问题吗?或者你只是想了解d为什么它会这样工作?@Apurv:它是特定于语言/平台的-您可以创建一种具有整数类型的语言,而整数类型确实知道无穷大。您可能会对它进行优化,以便与直接支持我们习惯的本机类型的CPU一起工作。@metalideath我正在试图理解它为什么会这样工作。@JonSkeet T谢谢你的帮助。整数计算是在处理器中完成的,而实数计算是在数学协处理器中完成的,这与此有什么关系吗?