繁体   English   中英

除以零后的余数

[英]Remainder after division by zero

我知道数学中不允许用零除,但是我可以用零取模,应该得到什么答案?

例如

10%0 = ?
5%0 = ?

该标准将其定义为“未定义”。

在几乎所有处理器中,模都是由与除法相同的功能执行的。 在现代的大型处理器中,它是一条指令(例如x86)。 通常,该指令在被零除时将导致陷阱,并且无论代码是“打算使用模”部分还是“商”部分,这都适用。

它是未定义的,因此处理器和编译器可以自由地实现自己喜欢的功能-例如,如果处理器只是返回输入中输入的任何内容,这也是允许的,或者如果它导致整个OS崩溃,那也“很好”。标准。

总而言之,零模与除以零一样不好。

(请注意,通常,除以零的浮点数不会捕获(默认情况下),并且会生成无穷大的值,除非除以零的值也为零,在这种情况下,您会得到“非数字”)

在C / C ++中,它是Undefined behavior ,您可以根据编译器甚至同一程序的不同实例获得各种结果。

C11dr§6.5.5

二进制/运算符产生商,二进制%运算符产生第一个表达式除以第二个表达式的余数。 如果/或%的第二个操作数为零,则行为不确定

结果是UB

C11dr§6.5.5“ /运算符的结果是第一个操作数除以第二个的商;%运算符的结果是余数。在两个运算中,如果第二个操作数的值为零,行为是不确定的。”

从数学上讲,您应该得到无限,这是正确的答案...以编程方式,任何明智的编译器都会警告您除以零,因为在内部将模运算符(至少在C / C ++中)转换为除法运算符(在大多数实现中)。 因此,问题的答案是,在两种情况下,您都将得到一个浮点异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM