作者Kayusumi (Left)
看板C_and_CPP
标题[问题] C sqrt()错误
时间Thu May 24 11:42:51 2018
开发平台(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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.76.65.68
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1527133375.A.238.html
1F:→ djshen: 跟上面一样是怎样.. 05/24 11:52
2F:→ nh60211as: 你跟上一篇是同事吗 05/24 11:59
3F:→ newlymoon: 不好意思 他是我同事 = = 05/24 12:02
4F:→ Kayusumi: 楼上强者我同事 05/24 12:38
5F:→ LPH66: ok, 同上一篇回应, 你们是在什麽情境下"错"的也要写出来 05/24 14:46
6F:→ LPH66: 只看"对"的东西对解决"错"的东西没有帮助 05/24 14:46
7F:推 LPH66: 单讲侦错模式我们根本不知道是执行什麽东西时侦错 05/24 15:12
8F:→ LPH66: 虽然提了这麽多, 但是还是给个水晶球里的显像供参考 05/24 15:21
9F:→ LPH66: 检查一下是否有 float 跟 double 的混用 05/24 15:22
10F:→ LPH66: 组语的计算跟回传是否为正确的浮点数型态 05/24 15:22
11F:→ LPH66: 以及你们 A = sqrt(B) 当中两者的型态以及你们的 sqrt 型态 05/24 15:23
12F:→ Kayusumi: 输入输出都是double, 我猜是可能参照到不同的math.h, 因 05/24 15:39
13F:→ Kayusumi: 为再测试ceil之类的函式也是错的, 最後就是math.h相关全 05/24 15:39
14F:→ Kayusumi: 部在外面包一层 05/24 15:39
15F:→ descent: 可能要反组译一下, 看看 sqrt 的程式码是不是有不同? 05/24 15:58
16F:→ descent: math.h 不是只有一个, 怎麽会用到不同的, 05/24 15:59
17F:→ descent: 你们混用不同的开发工具吗? 05/24 15:59
18F:→ Kayusumi: 我们有几种执行环境, 最後用的库不太一样 05/24 16:06
19F:→ Kayusumi: 比较奇特的是有问题的那几个函式,逐步执行进不去(ceil 05/24 16:10
20F:→ Kayusumi: sqrt之类) 05/24 16:10
21F:→ Kayusumi: 也有可能是complier设错导致,这是新开的执行环境 05/24 16:13
22F:推 descent: 是不是都是 math.h 的函式有错误? 05/24 18:31
23F:→ Kayusumi: 目前查到是这样没错,但也不是每个都错 05/24 20:32
24F:→ Kayusumi: 有问题的用逐步执行不会进函式里面 05/24 20:36
※ 编辑: Kayusumi (203.133.119.129), 05/24/2018 21:18:14
25F:→ notBeing: 有需要cross bank吗? 05/25 00:39
26F:推 yvb: 那个 sqrt(25.0) 的错误回传值 1077478015 是否不固定会乱跳? 05/25 13:44
27F:→ yvb: 若是, 可能被当成 int sqrt() 了? X86_64 ABI 问题? 05/25 13:46
28F:→ yvb: 若是 X86 ABI (32-bit) 应该没这种情况. 05/25 13:48
29F:→ yvb: 叫用 sqrt(25.0) 之前再宣告一下 double sqrt(double); 看看? 05/25 13:50
30F:→ Kayusumi: 当时有测试不管输入double/int的值回来都是错的 05/25 20:09
31F:→ remember: 有问题就 trace 组语啊 XD 05/26 11:36
32F:→ Kayusumi: 这就是神奇的地方,没办法进去TRACE它跑啥,但像memcpy 05/26 12:36
33F:→ Kayusumi: 这种就可以进去 05/26 12:36
34F:→ tinlans: 要用组语层级的单步执行去追就能进去吧 05/26 13:47
35F:→ Kayusumi: 应该说 有问题这几个 用单步也进不去, 会直接丢值回来, 05/26 15:30
36F:→ Kayusumi: 但没问题的就可以用单步进去 05/26 15:30
37F:→ Kayusumi: 这个状况只发生在某环境的执行档,另一个就不会 orz 05/26 15:34
38F:→ Schottky: 干嘛死咬着能不能单步执行... 05/26 18:09
39F:→ Schottky: 单步执行组语也要看得懂组语才行,虽然不知为何 C++ 板 05/26 18:11
40F:→ Schottky: 的诸位好像都看得懂 XD 看不懂才正常吧 05/26 18:11
41F:→ Schottky: 能用 C 语言层级单步追踪进去,条件是要有 C 原始码和 05/26 18:13
42F:→ Schottky: debug symbol 记载原始码和执行档/程式库的对应关系 05/26 18:13
43F:→ Schottky: 跟程式码本身有没有错误毫无关联 05/26 18:14
44F:→ Kayusumi: 我是觉得可能什麽东西设错导致LINK的时候有错啦 05/26 19:46
45F:→ Kayusumi: 毕竟这是基础函式库 05/26 19:46