C库函数log、sqrt的时间复杂度是多少?

Octogen 2003-06-30 02:54:32
是O(1)吗?

看了个验证完全平方数的贴子想起来的。
...全文
3460 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Octogen 2003-07-02
  • 打赏
  • 举报
回复
我也不太懂,都是刚从处理器手册里看的。
dcyu 2003-07-01
  • 打赏
  • 举报
回复
楼主能否介绍一下浮点协处理器还有哪些运算?
alphapaopao 2003-07-01
  • 打赏
  • 举报
回复
sqrt log 这样的函数,都是调用相应的CPU指令,也就是说函数本身不作数值运算。
在intel 的CPU手册上可以看到,这些初等函数消耗的CPU周期都是有一个范围的。所以
这些函数可以当成常数复杂度来看待。这些函数所消耗的时间和你的问题的规模没关系。


============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://alphasun.betajin.com/ 遇到问题可以给我发消息,给我发信息时请附带原帖地址
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
寻开心 2003-07-01
  • 打赏
  • 举报
回复
sqrt比log要费时间。
好的做法是先查询表格,然后使用迭代方法获得更精确的数据。
ZhangYv 2003-07-01
  • 打赏
  • 举报
回复
sqrt似乎是用斯特劳林公式展开后求近似的.肯定不是O(1)
Octogen 2003-07-01
  • 打赏
  • 举报
回复
嗯,搜了一下Quake3的源代码,只找到sqrt的,好象是利用级数展开式做近似计算。
估计VC的RTL也一样,只不过是用汇编实现罢了。

double sqrt( double x )
{
float y;
float delta;
float maxError;

if ( x <= 0 ) {
return 0;
}

// initial guess
y = x / 2;

// refine
maxError = x * 0.001;

do {
delta = ( y * y ) - x;
y -= delta / ( 2 * y );
} while ( delta > maxError || delta < -maxError );

return y;
}

Octogen 2003-07-01
  • 打赏
  • 举报
回复
这些在Intel的CPU手册里能找到详细的说明。没有问题的话我就结贴了。
BlueSky2008 2003-07-01
  • 打赏
  • 举报
回复
刚才用VC找了一下sqrt,log的源码,结果是没找到源码,只有汇编代码。
本来汇编学的就不好,这两个函数的代码里还尽是从没见过的数学指令,看得头都大了。
不过有一点还是可以确定的,这两个函数都没有自己计算,而是直接用了数学指令,
不过我不太同意dcyu的观点,计算机内这些数学指令不可能用模拟电路实现的,应该还是数字电路,
这些指令实际上相当于一段微程序,只是不知道他算法怎样。记得以前看过一本计算机组成原理,
有讲这些复杂数学函数的计算的,可惜没认真看。:(
alphapaopao 2003-07-01
  • 打赏
  • 举报
回复
Riemann():
哦,这个可能黎曼兄有所不知了。
sqrt, sin, cos, log 等指令属于FPU的指令,不是CPU指令,不过现在的FPU都是可CPU坐在一个芯片上的。

FPU 就是浮点协处理器,他专门负责浮点运算,还负责初等函数的求值,另外它还内置了很多常量,比如 PI, e 等。

我曾看到浮点协处理器的 specification , intel 出版的,sin 这样的函数,在 100 个周期左右,具体我也记不清楚了。
dcyu 2003-07-01
  • 打赏
  • 举报
回复 1
数字电路也是可以做出对数电路的,数字电路可以完成模拟电路可以实现的一切运算。
浮点型cpu我想这方面的设计会很复杂,估计会消耗几百个cpu时间周期。
Octogen 2003-07-01
  • 打赏
  • 举报
回复
多谢各位!Intel有相应的浮点指令:

FSQRT 求平方根
FYL2X 求以2为底的对数

还有SIN、COS什么的。我想一向以效率著称的Quake3应该是为了可移植性才用C实现的这些函数吧?
Riemann 2003-07-01
  • 打赏
  • 举报
回复
如果真有相应的sqrt,log之类的机器指令,那在汇编中也应该存在相应的基本算术操作了,可是汇编却没有提供。我更倾向于sqrt,log都是通过执行一系列的+,-,*,/操作来实现的这种说法。
dcyu 2003-06-30
  • 打赏
  • 举报
回复
虽然不知道,但我觉得CPU中会有求对数的指令,因为在模拟电路中可以通过二极管的特性做出求对数的电路,CPU的电路也应该会有这方面的设计。是我的一个猜想,虽然没学过这方面的课程。

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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