[問題] 為什麼輸出之後有負0?

看板C_and_CPP作者 (Lizst)時間15年前 (2010/10/05 22:32), 編輯推噓6(6021)
留言27則, 6人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 這是我寫的高斯喬丹消去法, 是從input.txt 輸入數值後做運算 但是我輸出之後有一列的數字0 會變成 -0 (目前跑出來的結果還不符合 RREF, 會再加個排序的迴圈) 雖然方法不是很聰明, 還是希望大家予以指教, 謝謝 ^^" 希望得到的正確結果: 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 程式跑出來的錯誤結果: 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 -0 -0 -0 1 -0 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev c++ 有問題的code: (請善用置底文標色功能) http://paste.plurk.com/show/314623/ 補充說明: 我寫一個 cout << 0/(-3); 做為測試, 顯示結果是零 好像是程式經過這行 M[r][m] = M[r][m]/temp; 如果 M[r][m] 是負的, 同一列是0 的元素都會變成 -0 但是我還是不知道原因在哪裡 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.202.53

10/05 22:51, , 1F
浮點數精確度問題?
10/05 22:51, 1F

10/05 22:58, , 2F
可是不用double, 如果出現無限小數那誤差會很大@@a
10/05 22:58, 2F

10/05 22:58, , 3F
是有google 找到有人用分數的方式處理, 不過
10/05 22:58, 3F

10/05 22:59, , 4F
在下才疏學淺, 看不懂 ~"~
10/05 22:59, 4F

10/05 23:00, , 5F
可能是精度問題可能不是, 你不要試0/(-3)這種compile
10/05 23:00, 5F

10/05 23:00, , 6F
對了, 如果型態用int 的話, 右上角的1會變-1 ^^"
10/05 23:00, 6F

10/05 23:00, , 7F
time constant, 改用double d; cin>>d; cout<<0/d; 試試
10/05 23:00, 7F

10/05 23:00, , 8F
to VictorTom大: 我有試過了, 可是出來是0
10/05 23:00, 8F

10/05 23:01, , 9F
看, 這樣如果d輸入負數也會印出-0. (別輸入+-0啊XD)
10/05 23:01, 9F

10/05 23:02, , 10F
疑?? 我用VC2005測, 0/(-3)out0, 0/d out -0(如果d<0).
10/05 23:02, 10F

10/05 23:02, , 11F
sorry 我還以為是直接cout << 0/(-3) ~"~
10/05 23:02, 11F

10/05 23:03, , 12F
剛試了一下, 真的會出現 -0
10/05 23:03, 12F

10/05 23:03, , 13F
DOUBLE最高位是代表正負的關係吧
10/05 23:03, 13F

10/05 23:04, , 14F
至於有沒有精度誤差要再看你的用途care不care, 不care
10/05 23:04, 14F

10/05 23:04, , 15F
那除了用 cmath.h 的函式庫, 有其他解決方法嗎?
10/05 23:04, 15F

10/05 23:04, , 16F
基本上就把它當作0吧, 浮點數表示法是可能產生正負0的,
10/05 23:04, 16F

10/05 23:04, , 17F
但計算上會視為相等:)
10/05 23:04, 17F

10/05 23:17, , 18F
這個負 0 其實是因為它是一個小小的負值
10/05 23:17, 18F

10/05 23:19, , 19F
例如像是 -2e-10 這種東西 就當它是 0 即可
10/05 23:19, 19F

10/05 23:20, , 20F
以你這裡的簡單計算應該是 -2.22e-16 這種浮點數誤差值吧
10/05 23:20, 20F

10/05 23:24, , 21F
有可能真的是剛好算出了 -0.0 啊XD
10/05 23:24, 21F

10/05 23:25, , 22F
是說我沒有看code啦, 所以才說會care是否有誤差再找方法
10/05 23:25, 22F

10/05 23:25, , 23F
處理/驗證XD
10/05 23:25, 23F
我目前的處理方式 (私心覺得-0 很礙眼) 是#include <cmath> 這個函式庫裡面有個fabs() 可以取浮點數的絕對值, 不過還在想其他辦法就是了 ^^" 感謝板上各位大大的解答 ^^ ※ 編輯: Lizstlin 來自: 140.115.202.53 (10/05 23:51)

10/05 23:57, , 24F
(int)M[r][m] 直接轉型就好了吧
10/05 23:57, 24F

10/06 00:58, , 25F
你可以多加一層 絕對值小於某很小的值 就當做是0
10/06 00:58, 25F

10/06 01:13, , 26F
To stupid0319 若答案有小數就不能轉換吧 ^^"
10/06 01:13, 26F
※ 編輯: Lizstlin 來自: 140.115.202.53 (10/06 01:14)

10/06 01:14, , 27F
還是謝謝兩位的方法 ^^
10/06 01:14, 27F
文章代碼(AID): #1CgpRWAe (C_and_CPP)