为什么发生以下零除错误?
>>> from uncertainties import ufloat
>>> a = ufloat((0,0))
>>> x = ufloat((0.3,0.017))
>>> a**x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/uncertainties/__init__.py", line 601, in f_with_affine_output
if arg.derivatives
File "<string>", line 1, in <lambda>
ZeroDivisionError: 0.0 cannot be raised to a negative power
>>> 0.0**x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/uncertainties/__init__.py", line 601, in f_with_affine_output
if arg.derivatives
File "<string>", line 1, in <lambda>
ValueError: math domain error
这些都不应该都返回0.0吗?
解决方法:
情况非常微妙:
>一方面,您是对的,两个结果在数学上都应该为0.
实际上,该行为应与Python相同:
>>> 0.**0.3
0.0
当指数具有不确定性时,结果应为
正好为0(没有不确定性),因为Python结果始终为0.
a = 0±0的情况很特殊:即使正x,a ** x也为0,即使
x具有不确定性(结果未定义为零或负
x值).另一方面,如果a = 0±0.1,则a ** x的值
之所以未定义,是因为无法获得否定的(实际)力量
数字(如果不确定性为非零,则a可以为负)(除非一个使用
复数,这不是不确定性的目的
包).
>另一方面,不确定性模块使用户可以随时更改数字的不确定性,但仍可获得正确的结果.这与上面的“理想”数学结果相冲突:如果a = 0±0,则a ** x的结果稍后可能不确定;相反,如果a = 0±0.3,则结果应该是不确定的,但是如果a的不确定性后来更改为0,则结果应变为0.
从技术上讲,这全都归结为a ** x与0 < x < 1是在a = 0中定义的,但在那是不可微的:不确定性为零的情况应该起作用(定义了函数),但不确定性为非零的情况必须产生误差(未定义导数).这两种情况都必须以某种方式动态处理,因为不确定性可以由用户即时更改. 这是一个有趣的情况,因此我将再次考虑不确定性模块是否可以以某种优雅的方式修改并适应这个问题. PS:从版本2.3.5开始,the uncertainties package可以正确处理问题的情况,更一般而言,所有不确定性数字实际上具有零不确定性的情况(即使相同数字但非零不确定性也会给出不确定的情况)通过误差的线性传播产生误差,就像在问题中一样).