- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Python内置的pow(x, y)
(没有第三个参数)返回的结果和math.pow()
返回的值有区别吗>,在两个 float 参数的情况下。
我问这个问题是因为 documentation对于 math.pow()
意味着 pow(x, y)
(即 x**y
)本质上与 相同数学.pow(x, y)
:
math.pow(x, y)
Return x raised to the power y. Exceptional cases follow Annex ‘F’ of the C99 standard as far as possible. In particular, pow(1.0, x) and pow(x, 0.0) always return 1.0, even when x is a zero or a NaN. If both x and y are finite, x is negative, and y is not an integer then pow(x, y) is undefined, and raises ValueError.
Changed in version 2.6: The outcome of 1**nan and nan**0 was undefined.
注意最后一行:文档暗示 math.pow()
的行为是指数运算符 **
的行为(因此 pow (x, y)
)。这是官方保证的吗?
背景:我的目标是提供 both 内置 pow()
和 math.pow()
的实现具有不确定性的数字 其行为方式与常规 Python float 相同(相同的数值结果、相同的异常、极端情况下的相同结果等)。我有 already implemented效果很好的东西,但有一些 corner cases需要处理。
最佳答案
从签名中,我们可以看出它们是不同的:
pow(x, y[, z])
math.pow(x, y)
另外,在 shell 中尝试一下会给你一个快速的想法:
>>> pow is math.pow
False
了解两个函数之间行为差异的另一种方法是测试它们:
import math
import traceback
import sys
inf = float("inf")
NaN = float("nan")
vals = [inf, NaN, 0.0, 1.0, 2.2, -1.0, -0.0, -2.2, -inf, 1, 0, 2]
tests = set([])
for vala in vals:
for valb in vals:
tests.add( (vala, valb) )
tests.add( (valb, vala) )
for a,b in tests:
print("math.pow(%f,%f)"%(a,b) )
try:
print(" %f "%math.pow(a,b))
except:
traceback.print_exc()
print("__builtins__.pow(%f,%f)"%(a,b) )
try:
print(" %f "%__builtins__.pow(a,b))
except:
traceback.print_exc()
然后我们可以注意到一些细微的差异。例如:
math.pow(0.000000,-2.200000)
ValueError: math domain error
__builtins__.pow(0.000000,-2.200000)
ZeroDivisionError: 0.0 cannot be raised to a negative power
还有其他区别,上面的测试列表并不完整(没有长数字,没有复杂等等),但这会给我们一个实用的列表,说明这两个函数的行为方式有何不同。我还建议扩展上述测试以检查每个函数返回的类型。您可能可以编写类似的东西来创建两个函数之间差异的报告。
math.pow()
math.pow()
处理其参数的方式与内置 **
或 pow()
非常不同。这是以灵 active 为代价的。看看the source ,我们可以看到 math.pow()
的参数是直接转换为 double :
static PyObject *
math_pow(PyObject *self, PyObject *args)
{
PyObject *ox, *oy;
double r, x, y;
int odd_y;
if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))
return NULL;
x = PyFloat_AsDouble(ox);
y = PyFloat_AsDouble(oy);
/*...*/
然后对 double 进行有效性检查,然后将结果传递给底层 C 数学库。
pow()
另一方面,内置的 pow()
(与 **
运算符相同)的行为非常不同,它实际上使用了对象自己的 **
运算符,如果需要,最终用户可以通过替换数字的 __pow__()
、__rpow__()
或 来覆盖它__ipow__()
,方法。
对于内置类型,研究为两种数值类型实现的幂函数之间的差异是有益的,例如,floats , long和 complex .
描述了模拟数字类型here .本质上,如果您要为不确定的数字创建新类型,您需要做的是提供 __pow__()
、__rpow__()
和可能的 __ipow__ ()
方法为您的类型。这将允许您的号码与运营商一起使用:
class Uncertain:
def __init__(self, x, delta=0):
self.delta = delta
self.x = x
def __pow__(self, other):
return Uncertain(
self.x**other.x,
Uncertain._propagate_power(self, other)
)
@staticmethod
def _propagate_power(A, B):
return math.sqrt(
((B.x*(A.x**(B.x-1)))**2)*A.delta*A.delta +
(((A.x**B.x)*math.log(B.x))**2)*B.delta*B.delta
)
为了覆盖 math.pow()
,您必须对其进行修补以支持您的新类型:
def new_pow(a,b):
_a = Uncertain(a)
_b = Uncertain(b)
return _a ** _b
math.pow = new_pow
请注意,要使其正常工作,您必须处理 Uncertain
类以处理 Uncertain
实例作为 __init__()
关于python - Python 中用于 float 的内置 pow() 和 math.pow() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10282674/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!