[问题] C sqrt()错误

楼主: Kayusumi (Left)   2018-05-24 11:42:51
开发平台(Platform): (Ex: Win10, Linux, ...)
WinXP
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VS2005
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
Math.h
问题(Question):
sqrt错误
喂入的资料(Input):
25.0
预期的正确结果(Expected Output):
5.0
错误结果(Wrong Output):
1077478015.000000
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
目前在一个Lib内新建一些函式及功能,因为跟预期值不一样所以进侦错模式看
发现如果直接用A = sqrt(B),A的值会错掉
例如会得到sqrt(25.0)=1077478015.000000
但如果在外部把sqrt包过一层再呼叫数值就对了
例如
double my_sqrt(double input)
{
return sqrt(input);
}
这时候my_sqrt(25.0)=5.0
补充说明(Supplement):
这个系统在dos版本上,主流程使用的sqrt是系统内建的
中断使用的sqrt是用组语另外写的,问过主管说是为了避免一些stack混用的问题
但目前在windows平台上,不管在中断还是主流程用的都是math.h的sqrt
我不能理解直接呼叫sqrt跟再包过一层有什么差别?
基本上有关于浮点数内部计算都是用double
作者: djshen (djshen)   2018-05-24 11:52:00
跟上面一样是怎样..
作者: nh60211as   2018-05-24 11:59:00
你跟上一篇是同事吗
作者: newlymoon (NEWLYMOON)   2018-05-24 12:02:00
不好意思 他是我同事 = =
楼主: Kayusumi (Left)   2018-05-24 12:38:00
楼上强者我同事
作者: LPH66 (-6.2598534e+18f)   2018-05-24 14:46:00
ok, 同上一篇回应, 你们是在什么情境下"错"的也要写出来只看"对"的东西对解决"错"的东西没有帮助单讲侦错模式我们根本不知道是执行什么东西时侦错虽然提了这么多, 但是还是给个水晶球里的显像供参考检查一下是否有 float 跟 double 的混用组语的计算跟回传是否为正确的浮点数型态以及你们 A = sqrt(B) 当中两者的型态以及你们的 sqrt 型态
楼主: Kayusumi (Left)   2018-05-24 15:39:00
输入输出都是double, 我猜是可能参照到不同的math.h, 因为再测试ceil之类的函式也是错的, 最后就是math.h相关全部在外面包一层
作者: descent (“雄辩是银,沉默是金”)   2018-05-24 15:58:00
可能要反组译一下, 看看 sqrt 的程式码是不是有不同?math.h 不是只有一个, 怎么会用到不同的,你们混用不同的开发工具吗?
楼主: Kayusumi (Left)   2018-05-24 16:06:00
我们有几种执行环境, 最后用的库不太一样比较奇特的是有问题的那几个函式,逐步执行进不去(ceilsqrt之类)也有可能是complier设错导致,这是新开的执行环境
作者: descent (“雄辩是银,沉默是金”)   2018-05-24 18:31:00
是不是都是 math.h 的函式有错误?
楼主: Kayusumi (Left)   2018-05-24 20:32:00
目前查到是这样没错,但也不是每个都错有问题的用逐步执行不会进函式里面
作者: notBeing (read and be read)   2018-05-25 00:39:00
有需要cross bank吗?
作者: yvb   2018-05-25 13:44:00
那个 sqrt(25.0) 的错误回传值 1077478015 是否不固定会乱跳?若是, 可能被当成 int sqrt() 了? X86_64 ABI 问题?若是 X86 ABI (32-bit) 应该没这种情况.叫用 sqrt(25.0) 之前再宣告一下 double sqrt(double); 看看?
楼主: Kayusumi (Left)   2018-05-25 20:09:00
当时有测试不管输入double/int的值回来都是错的
作者: remember (人老也有天使收)   2018-05-26 11:36:00
有问题就 trace 组语啊 XD
楼主: Kayusumi (Left)   2018-05-26 12:36:00
这就是神奇的地方,没办法进去TRACE它跑啥,但像memcpy这种就可以进去
作者: tinlans ( )   2018-05-26 13:47:00
要用组语层级的单步执行去追就能进去吧
楼主: Kayusumi (Left)   2018-05-26 15:30:00
应该说 有问题这几个 用单步也进不去, 会直接丢值回来,但没问题的就可以用单步进去这个状况只发生在某环境的执行档,另一个就不会 orz
作者: Schottky (顺风相送)   2018-05-26 18:09:00
干嘛死咬著能不能单步执行...单步执行组语也要看得懂组语才行,虽然不知为何 C++ 板的诸位好像都看得懂 XD 看不懂才正常吧能用 C 语言层级单步追踪进去,条件是要有 C 原始码和debug symbol 记载原始码和执行档/程式库的对应关系跟程式码本身有没有错误毫无关联
楼主: Kayusumi (Left)   2018-05-26 19:46:00
我是觉得可能什么东西设错导致LINK的时候有错啦毕竟这是基础函式库

Links booklink

Contact Us: admin [ a t ] ucptt.com