求教大神math头文件里究竟是怎样的算法?哪么变态

baidu_32238993 2015-12-28 09:08:30
看头文件没有看出什么东西来。我自己写的开方算法,开几十万次从十几秒优化到几百毫秒,然后稍微改两个字母改成math里的瞬间百分之一秒不到,彻底跪了。求大神那里面到底是啥算法?
...全文
357 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
赵4老师 2015-12-29
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
lm_whales 2015-12-29
  • 打赏
  • 举报
回复
移位开方算法: 把数按照2Bits一节分成若干节 逐次开方 每节对应开方结果的一位,根 r初始化为0 第一步,r左移一位 设置一个数表示余数remain,,先取第一节放在余数尾部 如果当前余数 >=2r+1 则r加一,remain减 2r+1否则不加 如此循环直到需要的精度为止。 步数总和- (原始数据的字位数+1)/2 是小数位数 如果余数为0 就可以终止了。然后计算下位数。平方根就求出来了 这样计算的平方根是精确的平方根。可以任意精度计算。也可以四舍五入(0舍1入)
引用 12 楼 lm_whales 的回复:
有一种开方指令的实现。和手动开方相似 移位开方,可以对整数开方,应该也不慢 毕竟 80Bits 浮点数也只是64BIts尾数 先对指数部分开方只是个简单的除以2操作 64Bits 尾数,即便开方成64BIts 也只是64步而已,不能算慢 CPU内部硬件运算,比CPU对外的指令快多了, 即便用微码实现也比用 高级语言快。
lm_whales 2015-12-29
  • 打赏
  • 举报
回复
有一种开方指令。和手动开方相似 移位开方,可以对整数开方,应该也不慢 毕竟 80Bits 浮点数也只是64BIts尾数 先对指数部分开方只是个简单的除以2操作 64Bits 尾数,即便开方成64BIts 也只是64步而已,不能算慢 CPU内部硬件运算,比CPU对外的指令快多了, 即便用微码实现也比用 高级语言快。
lm_whales 2015-12-29
  • 打赏
  • 举报
回复
CPU硬件实现的浮点算法,应该都是比较快的,因为硬件可以并行计算 而且频率比外部要高
fefe82 2015-12-29
  • 打赏
  • 举报
回复
好多 CPU 已经有开平方指令了。
fly_dragon_fly 2015-12-29
  • 打赏
  • 举报
回复
windows的计算器用的是泰勒展开, sqrt以前是牛顿迭代, 现在不知道有没有改了
醉花阴柳 2015-12-29
  • 打赏
  • 举报
回复
引用 17 楼 醉花阴柳的回复:
关于开方的有一个不可思议的代码段,楼主搜索 由sqrt引发的血案 这篇博文看看吧
http://m.blog.csdn.net/blog/dl0914791011/41241637
醉花阴柳 2015-12-29
  • 打赏
  • 举报
回复
关于开方的有一个不可思议的代码段,楼主搜索 由sqrt引发的血案 这篇博文看看吧
lm_whales 2015-12-29
  • 打赏
  • 举报
回复
一般数学函数。 都是直接使用浮点运算器FPU对应的功能 (指令) 早期,有软件仿真FPU硬件,执行浮点寄存器指令的。 (例如TC,BC 就有,这是可选项。可以硬件执行,也可以选仿真执行) 如今应该没有了
  • 打赏
  • 举报
回复
一般来说就是fsqrt指令,或者用SSE的sqrtss、sqrtsd指令,二者性能大致相当,在较新的处理器上都是10几个时钟周期,不过fsqrt涉及到浮点load/store,比SSE的load/store要慢一些,但是它的精度是最好的。
baidu_32238993 2015-12-29
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
直接看他的汇编不就知道了
看不懂汇编,咋学啊?
paschen 2015-12-29
  • 打赏
  • 举报
回复
引用 8 楼 baidu_32238993 的回复:
[quote=引用 2 楼 paschen 的回复:] 直接看他的汇编不就知道了
看不懂汇编,咋学啊?[/quote] 一般来说标准库提供的效率都相对较高,而且通用性强 math.h中很多算法都直接使用的汇编指令来写,所以效率会很高,但我具体也没研究
baidu_32238993 2015-12-29
  • 打赏
  • 举报
回复
引用 4 楼 CharlesSimonyi 的回复:
math.h的源代码是可见的,可以跟进去看看
我逐语句调试,然后直接就跳过去了...真的跳过去了
mewiteor 2015-12-28
  • 打赏
  • 举报
回复
Fast inverse square root 虽然这不一定是math.h中的开方算法,但它真的很快。
wang0635 2015-12-28
  • 打赏
  • 举报
回复
《C标准库》一书可供参考
encoderlee 2015-12-28
  • 打赏
  • 举报
回复
math.h的源代码是可见的,可以跟进去看看
pathletboy 2015-12-28
  • 打赏
  • 举报
回复
无代码无真相啊
paschen 2015-12-28
  • 打赏
  • 举报
回复
直接看他的汇编不就知道了
baidu_32238993 2015-12-28
  • 打赏
  • 举报
回复
但是我发现我写的指数函数意外的竟然比math里的效率高。主要是开方,哪怕是泰勒展开的计算量也不止如此啊,math里是怎么开方的?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧