python除以0的问题_Python不确定性软件包中的零除错误

为什么发生以下零除错误?

>>> from uncertainties import ufloat

>>> a = ufloat((0,0))

>>> x = ufloat((0.3,0.017))

>>> a**x

Traceback (most recent call last):

File "", line 1, in

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 "", line 1, in

ZeroDivisionError: 0.0 cannot be raised to a negative power

>>> 0.0**x

Traceback (most recent call last):

File "", line 1, in

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 "", line 1, in

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可以正确处理问题的情况,更一般而言,所有不确定性数字实际上具有零不确定性的情况(即使相同数字但非零不确定性也会给出不确定的情况)通过误差的线性传播产生误差,就像在问题中一样).

标签:python,uncertainty

来源: https://codeday.me/bug/20191201/2080950.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值