ruby - 为什么浮点数除以零不会在 Ruby 中引发异常?
问题描述
Integer
将 a除以零ZeroDivisionError
:
0 / 0 # ZeroDivisionError
但是除以零Float
不会:
0.0 / 0 #NaN
0 / 0.0 #NaN
0.0 /0.0 #NaN
1.0 / 0 #Infinity
1 / 0.0 #Infinity
1.0 /0.0 #Infinity
Integer
我想知道为什么 Ruby和Ruby的行为会有这种差异Float
?
解决方案
与几乎所有编程语言一样,ruby 的浮点运算实现符合IEEE 754标准。
该规范(上面链接)定义了五个必须(至少在默认情况下)以特定方式处理的异常:
无效运算:数学上未定义,例如,负数的平方根。默认情况下,返回 qNaN。
除以零:对有限操作数的运算给出精确的无限结果,例如 1/0 或 log(0)。默认情况下,返回±无穷大。
溢出:结果太大而无法正确表示(即,其具有无限指数范围的指数将大于 emax)。默认情况下,对于最近舍入模式返回 ±infinity(并遵循有向舍入模式的舍入规则)。
下溢:结果非常小(超出正常范围)且不精确。默认情况下,返回次正规或零(遵循舍入规则)。
不精确:精确(即未四舍五入的)结果不能精确表示。默认情况下,返回正确舍入的结果。
因此1.0/0
必须相等+Infinity
,而且0.0/0
必须相等NaN
。
Integer
对象不符合上述标准。(没有Infinity
or NaN
,并且所有操作都是精确的。)因此,针对诸如1/0
.
推荐阅读
- function - Pine Script - 具有较短时间框架的增量交易量
- javascript - 挖掘子对象并重建数据
- python - 使用正则表达式根据上下文替换字符串中的点
- node.js - 使用 fs 从护照中保存 PDF 会损坏它
- c# - 受保护文件夹中的外部图像不会显示在子报表 RDLC 上
- linux - 如何将 MQ 队列记录卸载到可读格式的文件中?
- python - 将两个 pandas 行转换为一个
- r - 使用回归模型预测 R 中的值的问题
- python - 如何检查一行是否包含Python中的字符串
- flutter - 没有为类型“_MyHomePageState”定义方法“文本”