当前位置: 首页 > news >正文

python中pow_Python中float的内置pow()和math.pow()之间的区别?

快速检查

从签名中,我们可以看出它们是不同的: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()非常不同。这是以牺牲灵活性为代价的。看一下the source,我们可以看到math.pow()的参数直接转换为doubles: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);

/*...*/

然后对doubles进行有效性检查,然后将结果传递给底层的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(),必须对其进行monkey修补以支持新类型:def new_pow(a,b):

_a = Uncertain(a)

_b = Uncertain(b)

return _a ** _b

math.pow = new_pow

请注意,要实现这一点,您必须将Uncertain类包装起来,以处理作为__init__()输入的Uncertain实例

相关文章:

  • python3.6标准库pdf_python3.6下载|python3.6官方版-520下载站
  • python常用单词有多少_在python中,如何找出一个单词中有多少个单独的字母?
  • wireshark抓取dns_利用Scapy打造简单的DNS监测脚本
  • flash动画在新媒体中的应用_2020年宁德市新媒体新技术创新应用课堂教学研讨活动(高中组)在宁德市高级中学举行(二)...
  • python语言流程控制语句的格式_慢步学python,编程基础知识,流程控制语句if
  • 输变电设备物联网传感器数据通信规约_物联网大潮来袭,无线通讯模块如何连接未来?...
  • python怎么爬取app数据_python高级教程 爬虫抓取App数据
  • python中loop函数_为何GAMLOOP中函数输出的Python Scopage不计算?
  • springboot 源码_SpringBoot是如何实现自动配置的? SpringBoot源码(四)
  • etw系统provider事件较多_使用Spring Gateway和KeyCloak构建一个OIDC认证系统
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • java中int和integer的区别_Java中关于强、软、弱、虚引用的区别
  • android 投屏_[Android] 虫洞手机投屏电脑(支持键盘映射和传声音)
  • 云丁智能锁说明书_真硬核!行业爆发前夜,这把锁登上航母
  • python调用node_node-python:在nodejs中调用python代码
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Date型的使用
  • django开发-定时任务的使用
  • Javascript编码规范
  • Javascript弹出层-初探
  • jquery ajax学习笔记
  • js面向对象
  • Python利用正则抓取网页内容保存到本地
  • springboot_database项目介绍
  • Yeoman_Bower_Grunt
  • 从tcpdump抓包看TCP/IP协议
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 理清楚Vue的结构
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Java数据解析之JSON
  • ​Python 3 新特性:类型注解
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • %check_box% in rails :coditions={:has_many , :through}
  • (007)XHTML文档之标题——h1~h6
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • ***测试-HTTP方法
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net的C#语言取月份数值对应的MonthName值
  • @EnableConfigurationProperties注解使用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @Responsebody与@RequestBody
  • [100天算法】-目标和(day 79)
  • [2010-8-30]
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]