[問題] C sqrt()錯誤

看板C_and_CPP作者 (Left)時間6年前 (2018/05/24 11:42), 6年前編輯推噓3(3042)
留言45則, 11人參與, 6年前最新討論串1/1
開發平台(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

05/24 11:52, 6年前 , 1F
跟上面一樣是怎樣..
05/24 11:52, 1F

05/24 11:59, 6年前 , 2F
你跟上一篇是同事嗎
05/24 11:59, 2F

05/24 12:02, 6年前 , 3F
不好意思 他是我同事 = =
05/24 12:02, 3F

05/24 12:38, 6年前 , 4F
樓上強者我同事
05/24 12:38, 4F

05/24 14:46, 6年前 , 5F
ok, 同上一篇回應, 你們是在什麼情境下"錯"的也要寫出來
05/24 14:46, 5F

05/24 14:46, 6年前 , 6F
只看"對"的東西對解決"錯"的東西沒有幫助
05/24 14:46, 6F

05/24 15:12, 6年前 , 7F
單講偵錯模式我們根本不知道是執行什麼東西時偵錯
05/24 15:12, 7F

05/24 15:21, 6年前 , 8F
雖然提了這麼多, 但是還是給個水晶球裡的顯像供參考
05/24 15:21, 8F

05/24 15:22, 6年前 , 9F
檢查一下是否有 float 跟 double 的混用
05/24 15:22, 9F

05/24 15:22, 6年前 , 10F
組語的計算跟回傳是否為正確的浮點數型態
05/24 15:22, 10F

05/24 15:23, 6年前 , 11F
以及你們 A = sqrt(B) 當中兩者的型態以及你們的 sqrt 型態
05/24 15:23, 11F

05/24 15:39, 6年前 , 12F
輸入輸出都是double, 我猜是可能參照到不同的math.h, 因
05/24 15:39, 12F

05/24 15:39, 6年前 , 13F
為再測試ceil之類的函式也是錯的, 最後就是math.h相關全
05/24 15:39, 13F

05/24 15:39, 6年前 , 14F
部在外面包一層
05/24 15:39, 14F

05/24 15:58, 6年前 , 15F
可能要反組譯一下, 看看 sqrt 的程式碼是不是有不同?
05/24 15:58, 15F

05/24 15:59, 6年前 , 16F
math.h 不是只有一個, 怎麼會用到不同的,
05/24 15:59, 16F

05/24 15:59, 6年前 , 17F
你們混用不同的開發工具嗎?
05/24 15:59, 17F

05/24 16:06, 6年前 , 18F
我們有幾種執行環境, 最後用的庫不太一樣
05/24 16:06, 18F

05/24 16:10, 6年前 , 19F
比較奇特的是有問題的那幾個函式,逐步執行進不去(ceil
05/24 16:10, 19F

05/24 16:10, 6年前 , 20F
sqrt之類)
05/24 16:10, 20F

05/24 16:13, 6年前 , 21F
也有可能是complier設錯導致,這是新開的執行環境
05/24 16:13, 21F

05/24 18:31, 6年前 , 22F
是不是都是 math.h 的函式有錯誤?
05/24 18:31, 22F

05/24 20:32, 6年前 , 23F
目前查到是這樣沒錯,但也不是每個都錯
05/24 20:32, 23F

05/24 20:36, 6年前 , 24F
有問題的用逐步執行不會進函式裡面
05/24 20:36, 24F
※ 編輯: Kayusumi (203.133.119.129), 05/24/2018 21:18:14

05/25 00:39, 6年前 , 25F
有需要cross bank嗎?
05/25 00:39, 25F

05/25 13:44, 6年前 , 26F
那個 sqrt(25.0) 的錯誤回傳值 1077478015 是否不固定會亂跳?
05/25 13:44, 26F

05/25 13:46, 6年前 , 27F
若是, 可能被當成 int sqrt() 了? X86_64 ABI 問題?
05/25 13:46, 27F

05/25 13:48, 6年前 , 28F
若是 X86 ABI (32-bit) 應該沒這種情況.
05/25 13:48, 28F

05/25 13:50, 6年前 , 29F
叫用 sqrt(25.0) 之前再宣告一下 double sqrt(double); 看看?
05/25 13:50, 29F

05/25 20:09, 6年前 , 30F
當時有測試不管輸入double/int的值回來都是錯的
05/25 20:09, 30F

05/26 11:36, 6年前 , 31F
有問題就 trace 組語啊 XD
05/26 11:36, 31F

05/26 12:36, 6年前 , 32F
這就是神奇的地方,沒辦法進去TRACE它跑啥,但像memcpy
05/26 12:36, 32F

05/26 12:36, 6年前 , 33F
這種就可以進去
05/26 12:36, 33F

05/26 13:47, 6年前 , 34F
要用組語層級的單步執行去追就能進去吧
05/26 13:47, 34F

05/26 15:30, 6年前 , 35F
應該說 有問題這幾個 用單步也進不去, 會直接丟值回來,
05/26 15:30, 35F

05/26 15:30, 6年前 , 36F
但沒問題的就可以用單步進去
05/26 15:30, 36F

05/26 15:34, 6年前 , 37F
這個狀況只發生在某環境的執行檔,另一個就不會 orz
05/26 15:34, 37F

05/26 18:09, 6年前 , 38F
幹嘛死咬著能不能單步執行...
05/26 18:09, 38F

05/26 18:11, 6年前 , 39F
單步執行組語也要看得懂組語才行,雖然不知為何 C++ 板
05/26 18:11, 39F

05/26 18:11, 6年前 , 40F
的諸位好像都看得懂 XD 看不懂才正常吧
05/26 18:11, 40F

05/26 18:13, 6年前 , 41F
能用 C 語言層級單步追蹤進去,條件是要有 C 原始碼和
05/26 18:13, 41F

05/26 18:13, 6年前 , 42F
debug symbol 記載原始碼和執行檔/程式庫的對應關係
05/26 18:13, 42F

05/26 18:14, 6年前 , 43F
跟程式碼本身有沒有錯誤毫無關聯
05/26 18:14, 43F

05/26 19:46, 6年前 , 44F
我是覺得可能什麼東西設錯導致LINK的時候有錯啦
05/26 19:46, 44F

05/26 19:46, 6年前 , 45F
畢竟這是基礎函式庫
05/26 19:46, 45F
文章代碼(AID): #1R1ZI_8u (C_and_CPP)