[問題] 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