编程中整数除以整数一定是整数吗,怎么能让两个整型变量相除得到浮点数?

我不确定当前的情况如何,但是目前情况是FP异常检测支持与整数非常不同。整数除法陷阱很常见。 如果POSIXSIGFPE完全引发异常,则要求它引发。

但是,您可以找出它是哪种SIGFPE,以查看它实际上是除法异常。(不过,不一定要被零除:2的补码INT_MIN/ -1除陷阱,以及x64的x86 div以及idiv在64b / 32b除的商不适合32b输出寄存器时也陷阱。但是在使用的AArch64sdiv上不是这种情况。)

如果Windows首先提供了一个不同的异常,或者将它像Unix一样捆绑了相同算术异常的不同样式,则为IDK。如果是这样,则默认处理程序将解码额外的信息,以告诉您它是哪种异常。

POSIX和Windows都使用短语“被零除”来覆盖所有整数除法异常,因此显然这是常见的缩写。对于确实了解INT_MIN / -1(带2的补码)的问题的人,短语“被零除”可以视为除法异常的同义词。该短语立即指出了不知道为什么整数除法可能会成为问题的人们的常见情况。

对于大多数操作系统/ C ABI中的用户空间进程,默认情况下会屏蔽FP异常。

这是有道理的,因为IEEE浮点可以表示无穷大,并且具有NaN可以使用该值将误差传播到所有将来的计算中。

当掩盖异常时,这甚至可以使诸如此类的事情产生明智的结果:

FP检测错误的方法非常好:当掩盖异常时,它们会在FP状态寄存器中设置一个标志,而不是进行捕获。(例如,x86的MXCSR用于SSE指令)。该标志将保持设置状态,直到手动清除为止,因此您可以检查一次(例如在循环之后),以查看发生了哪些异常,而不是发生异常的位置。

已经提出了具有相似的“粘性”整数溢出标志来记录在一系列计算期间的任何时间是否发生溢出的提议。允许屏蔽整数除法异常在某些情况下会很好,但在其他情况下则很危险(例如,在地址计算中,您应陷阱而不是潜在地存储到虚假位置)。

但是,在x86上,要检测在一系列计算期间是否发生整数溢出,需要在每个计算之后放置一个条件分支,因为标志只是被覆盖了。MIPS的一条add指令将捕获有符号的溢出,而一条无符号的指令则永不捕获。因此,整数异常检测和处理的标准化程度要差很多。

整数除法不能选择生成NaN或Inf结果,因此以这种方式工作很有意义。

由整数除法产生的任何整数位模式都是错误的,因为它将表示特定的有限值。

但是,在x86上,如果掩盖了“无效的浮点”异常,则使用cvtsd2si或类似的转换指令将超出范围的浮点值转换为整数会生成“整数不确定”值。除符号位外,该值全为零。即INT_MIN。

}

有人这么回答,这显然不对

 ‘//’明明是整除,为什么结果不是整数,而会出现小数?

首先,关于除法有三种概念:传统除法、精确除法和地板除

#1、传统除法:整数相除结果是整数,浮点数相除结果是浮点数
#2、精确除法:无论操作数是整数还是浮点数,得到的商总是真实结果,总是得到浮点数
#3、地板除:无论操作数是整数还是浮点数,得到的商不保留浮点数的尾数

Python2.6中,‘/’按照以上三种除法概念把结果分得更细:比如,整数相除结果为整数,只要有一个浮点数结果就是浮点数(Python2.6:>>>3/2输出1);地板除‘//’(和Python3.0一样):操作数为整数,整除结果为整数。否则操作数只要有一个浮点数,结果就为小数(这里小数和浮点数有区别,就是这个区别能解释开头引入例题)

Python3.0中,‘/’保留小数,这把‘/’的结果合并起来了,无论操作数是整数还是浮点数,结果总都是浮点数(Python3.0:>>>3/2输出1.5);地板除‘//’(和Python2.6一样):同上

因此,现在,就能解释开头引入的例题了

第一个运算得到的结果是保留尾数数值的浮点数(当然也属于小数);而第二个运算,不保留尾数数值,直接截断仅保留其整数数值,但是因为有一个操作数是浮点数,所以得到的结果是小数,这个就是Python3.0对于‘//’的运算规则

内容来源于网络如有侵权请私信删除

}

我要回帖

更多关于 两个整型数据相除 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信