看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1527133375.A.238.html
djshen: 跟上面一樣是怎樣.. 05/24 11:52
nh60211as: 你跟上一篇是同事嗎 05/24 11:59
newlymoon: 不好意思 他是我同事 = = 05/24 12:02
Kayusumi: 樓上強者我同事 05/24 12:38
LPH66: ok, 同上一篇回應, 你們是在什麼情境下"錯"的也要寫出來 05/24 14:46
LPH66: 只看"對"的東西對解決"錯"的東西沒有幫助 05/24 14:46
LPH66: 單講偵錯模式我們根本不知道是執行什麼東西時偵錯 05/24 15:12
LPH66: 雖然提了這麼多, 但是還是給個水晶球裡的顯像供參考 05/24 15:21
LPH66: 檢查一下是否有 float 跟 double 的混用 05/24 15:22
LPH66: 組語的計算跟回傳是否為正確的浮點數型態 05/24 15:22
LPH66: 以及你們 A = sqrt(B) 當中兩者的型態以及你們的 sqrt 型態 05/24 15:23
Kayusumi: 輸入輸出都是double, 我猜是可能參照到不同的math.h, 因 05/24 15:39
Kayusumi: 為再測試ceil之類的函式也是錯的, 最後就是math.h相關全 05/24 15:39
Kayusumi: 部在外面包一層 05/24 15:39
descent: 可能要反組譯一下, 看看 sqrt 的程式碼是不是有不同? 05/24 15:58
descent: math.h 不是只有一個, 怎麼會用到不同的, 05/24 15:59
descent: 你們混用不同的開發工具嗎? 05/24 15:59
Kayusumi: 我們有幾種執行環境, 最後用的庫不太一樣 05/24 16:06
Kayusumi: 比較奇特的是有問題的那幾個函式,逐步執行進不去(ceil 05/24 16:10
Kayusumi: sqrt之類) 05/24 16:10
Kayusumi: 也有可能是complier設錯導致,這是新開的執行環境 05/24 16:13
descent: 是不是都是 math.h 的函式有錯誤? 05/24 18:31
Kayusumi: 目前查到是這樣沒錯,但也不是每個都錯 05/24 20:32
Kayusumi: 有問題的用逐步執行不會進函式裡面 05/24 20:36
※ 編輯: Kayusumi (203.133.119.129), 05/24/2018 21:18:14
notBeing: 有需要cross bank嗎? 05/25 00:39
yvb: 那個 sqrt(25.0) 的錯誤回傳值 1077478015 是否不固定會亂跳? 05/25 13:44
yvb: 若是, 可能被當成 int sqrt() 了? X86_64 ABI 問題? 05/25 13:46
yvb: 若是 X86 ABI (32-bit) 應該沒這種情況. 05/25 13:48
yvb: 叫用 sqrt(25.0) 之前再宣告一下 double sqrt(double); 看看? 05/25 13:50
Kayusumi: 當時有測試不管輸入double/int的值回來都是錯的 05/25 20:09
remember: 有問題就 trace 組語啊 XD 05/26 11:36
Kayusumi: 這就是神奇的地方,沒辦法進去TRACE它跑啥,但像memcpy 05/26 12:36
Kayusumi: 這種就可以進去 05/26 12:36
tinlans: 要用組語層級的單步執行去追就能進去吧 05/26 13:47
Kayusumi: 應該說 有問題這幾個 用單步也進不去, 會直接丟值回來, 05/26 15:30
Kayusumi: 但沒問題的就可以用單步進去 05/26 15:30
Kayusumi: 這個狀況只發生在某環境的執行檔,另一個就不會 orz 05/26 15:34
Schottky: 幹嘛死咬著能不能單步執行... 05/26 18:09
Schottky: 單步執行組語也要看得懂組語才行,雖然不知為何 C++ 板 05/26 18:11
Schottky: 的諸位好像都看得懂 XD 看不懂才正常吧 05/26 18:11
Schottky: 能用 C 語言層級單步追蹤進去,條件是要有 C 原始碼和 05/26 18:13
Schottky: debug symbol 記載原始碼和執行檔/程式庫的對應關係 05/26 18:13
Schottky: 跟程式碼本身有沒有錯誤毫無關聯 05/26 18:14
Kayusumi: 我是覺得可能什麼東西設錯導致LINK的時候有錯啦 05/26 19:46
Kayusumi: 畢竟這是基礎函式庫 05/26 19:46