wine中complex::pow 补丁的实现

来源:互联网 发布:复杂网络算法与应用pdf 编辑:程序博客网 时间:2024/06/05 18:32

我发了一个wine的补丁,实现complex::pow的部分重载:http://source.winehq.org/patches/data/104267

HongQian帮我在irc上问了Piotr对这个补丁的看法,他说:
“it generally looks ok but it's possible to implement it with better
precision, so I'm not sure what to think about it”

我想了想发现,其实我们在实现complex::pow
在指数为实整数的情况下的重载的时候,没有必要先把实整数转换为复数的。一开始我是为了简化补丁的难度,就建议参考最像的函数进行实现,没有充分考虑到精度的问题。”

我去查了一些资料,发现,以前初学C\C++用pow函数的时候有点疑惑,为什么参数int要转化成double,以为是系统规定的,当时为了编译能过就用了转换了,也没有看源代码的想法。今天才知道,原来是考虑到那么几个问题(overflow、负数次幂的结果)等才用double的,而且还提高了复用,感觉设计得很好~(除了给人一点点confuse)


然后我做了测试,这是在win下的结果:

pow(complex_float= (3.14159f, 0), 3):  (31.006203,0.000000)
complex_translation:  (31.006201,0.000000)
*******************************************************
pow(complex_float= (32.1234f, 0), 6):  (1098826752.000000,0.000000)
complex_translation:  (1098826624.000000,0.000000)
*******************************************************
pow(complex_float= (7.12f, 0), 6):  (130280.640625,0.000000)
complex_translation:  (130280.648438,0.000000)


*******************Now is complex_double************************************


pow(complex_double= (3.14159/2, 0), 3):  (3.875775, 0.000000)
double_complex_translation:  (3.875775, 0.000000)
*******************************************************
pow(complex_double= (32.12345678, 0), 13):  (38787300223012692000.000000, 0.000000)
double_complex_translation:  (38787300223012684000.000000, 0.000000)
*******************************************************
pow(complex_double= (7.12, 0), 33):  (13546895790785450000000000000.000000, 0.000000)
double_complex_translation:  (13546895790785442000000000000.000000, 0.000000)
*******************************************************

二分求幂现在决定用手写的底数为复数而指数为整数次幂的pow来解决,经zhenbo提醒,发现用二分求幂就可以高效率地实现循环相乘求值,于是使用实现之:

+complex_double* __cdecl complex_double_pow_ci(complex_double *ret, const complex_double *l, int r)+{+    complex_double c = *l;+    complex_double temp = { 1.0, 0 };+    complex_double_assign(ret, &temp);++    if(r < 0) {+        r = -r;+        complex_double_div(&c, &temp, l);+    }++    for(; r>0; r>>=1) {+        if(r & 1)+            complex_double_mult_assign(ret, &c);+        complex_double_assign(&temp, &c);+        complex_double_mult_assign(&c, &temp);+    }++    return ret;+}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 去法国会说英语不会说法语怎么办 企业有很多费用没有正式发票怎么办 我二张一万元的作废发票掉了怎么办 小规模上月开错税率的票怎么办 一般纳税人开票税率开错了怎么办 电信电子发票代表号码错了怎么办 发票备注栏项目名称写了两遍怎么办 苏州出入境手撕发票弄丢了怎么办 电脑下载过播放器还是不播放怎么办 局域网内的电脑无法互相访问怎么办 浏览器拖动滑动线页面会跳动怎么办 在暴风影音上视频播放不出来怎么办 格式工厂转换格式占内存太大怎么办 手机登陆不上路由器管理界面怎么办 新路由器设置密码后不能上网怎么办 更换网络后无线路由器不能用怎么办 手机登录不了路由器登录业面怎么办 海康威视通道用户被锁定怎么办 无线适配器或访问点有问题怎么办 客户买鞋子说价格贵该怎么办 小米5s刷成真砖后怎么办 手机电源键坏了开不了机怎么办 手机开关键坏了开不了机怎么办 vivo手机解屏密码忘了怎么办 小米max关机后开关键坏了怎么办 联想手机刷机失败无限重启怎么办 红米2a显示白屏怎么办 小米6手机一直处于开机状态怎么办 怎么在手机上看wifi密码怎么办 怎么查自己的宽带密码忘记了怎么办 怎么查自己宽带账号密码忘了怎么办 电脑重置路由器密码连不上网怎么办 e盘和f盘没有了怎么办 复制文件过程中自己卡住了怎么办 电脑卡住了怎么办 鼠标也点不动 善领wifi连上网不能用怎么办 苹果手机软件更新后网速太慢怎么办 装了固态硬盘开机还慢怎么办 华为荣耀8青春版玩游戏卡怎么办 光猫自带wifi网络很差怎么办 侠盗猎车手自由城之章卡退怎么办?