作者:
Wardyal (Wardyal)
2022-01-21 16:21:30剛剛看到的
https://i.imgur.com/UeBuvTy.jpg
https://i.imgur.com/1qUWOKJ.jpg
https://i.imgur.com/JZPY3pH.jpg
https://i.imgur.com/hsR0C39.jpg
所以為什麼有多0.00000004
0.1 + 0.2 不是 0.3 嗎
作者: zetarv (林林林) 2022-01-21 16:22:00
笑死,浮點數的bug
作者:
yankeefat (本人內建試製51cm連裝砲)
2022-01-21 16:23:00你的浮點運算壞掉了
作者: none049 (沒有人) 2022-01-21 16:23:00
世界上有10種人,懂二進制的跟不懂的
作者:
Wardyal (Wardyal)
2022-01-21 16:23:00殺小
作者:
god78987 (god78987)
2022-01-21 16:23:00google的到0.1+0.2
笑死 你可以Google一下精度損失 有滿多講解的
作者:
hgs1906 (受遺棄之子)
2022-01-21 16:24:00XDDDDD
作者:
a1919979 (狐狸精婊子)
2022-01-21 16:24:00就叫你%d中間要加數字了
再精確一點是 3.00000000000000044409e-01
作者:
arrenwu (鍵盤的戰鬼)
2022-01-21 16:27:00表示他用的是 double float ?
作者:
arrenwu (鍵盤的戰鬼)
2022-01-21 16:28:00(single) float 去算出來會是 0.3
single point 是 3.00000011920928955078e-01
作者: gama (我是γ) 2022-01-21 16:31:00
考慮用decimal嗎
作者:
hey1590 (老皮)
2022-01-21 16:32:00記得round啦 很多bug都是這樣來的
作者:
arrenwu (鍵盤的戰鬼)
2022-01-21 16:32:00這反映的是浮點數的等號沒太大意義。LeetCode上面就有問題是跟這個有關係
js的浮點數問題 有名到被拿來當考題最近我還有遇到空白檢查不出來的狀況-_-
作者:
hey1590 (老皮)
2022-01-21 16:35:00我上次就遇到數學函式的定義域傳入float 但在運算的過程就是多了後面導致error
要避免這種問題可以依照需要的精度乘以10^n全部用整數運算 然後轉換回去之後四捨五入不只是js 只要是IEEE754就有這問題 精度是有限的
作者:
arcanite (不問歲月任風歌)
2022-01-21 16:37:00我笑了XD
那就跟猴子被電還有買牛奶的笑話一樣工程師在笑 其他人都不懂
作者:
wei115 (ㄎㄎ)
2022-01-21 16:39:00幹,我居然笑了 真的有夠宅wwww
作者: KJC1004 2022-01-21 16:41:00
16樓證明js就是邪教每個坑都能讓工程師debug一整天
作者:
aaaaooo (路過鄉民)
2022-01-21 16:42:00這問題大概要等到量子電腦普及才有解
那個 其實如果你從c開始寫 就沒差了..w量子電腦嗎...我不認為現在的"量子"電腦能夠處理連續
1.0 + machine epsilon = 1.0 阿所以浮點數 ==, != 是有一個 espilon 範圍的
作者:
CaponeKal (CaponeKal)
2022-01-21 16:45:00記得這遊戲很硬核 一般人要玩很久才搞懂
machine epsilon 就是為了科學計算定義的咩...其實不是 是因為連續計算 特別是乘法之後...然後與其去為了程式語言或者平台調整 不如直接算整數.
記得digicurrency 也有人用python去抓虛擬幣值
有時候遇到這種情況真的會找Bug找到哭出來,尤其是兩個浮點數比較數值的時候,真的只有一個幹字
遇到浮點數我一律轉成字串用BigDecimal計算==
其實電腦是無法表示整個實數域的...我記得可以用鴿籠原理證明然後又會牽扯到哥德爾不完備所以計算機處理浮點數 就跟上面講的一樣 要定義最極限的 epsionepislon
除了 machine epsilon 還有safe minimumunderflow threshold, largest exponent before over
作者: gn0111 (Pula) 2022-01-21 16:53:00
因為浮點數
之前就遇過有人沒搞清楚這個寫出來的python跑結果然後論文出去之後被...
作者:
sbreezer ( 微塵風 )
2022-01-21 16:54:00這篇好臭
所以科學計算是蠻複雜的 除了演算法本身 連機器的運算精準度都要考慮
所以最好裝computing server的時候IT要設好啊...以前在lab有用science linux與python設定過一次不過當時其實也是照著套件的README去搞 也沒多想XD
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:02:00某方面來說這不是bug就是了,語言就照他設計的方式在運作
作者:
alpho (Whyyyyy)
2022-01-21 17:03:00那張js 的圖看一次笑一次w
如果電腦一個位元剛好有10種狀態的話 0.1+0.2不是問題
作者:
DANANPA (≧<>≦)
2022-01-21 17:04:00ECMAScript那種坑是因為這東西本來就是疊床架屋的..
但現實剛好只有兩種狀態,所以0.1和0.2他其實都不認識
不過這個只要是電資的學生大概就都會知道了吧,沒在唸的除外
電腦只認識0.5, 0.25, 0.125, 0.0625, 0.03125 ......
恩...這樣說數學上其實不太對 因為就算十進位系統只要是離散的符合圖靈機的 就無法處理連續 所以勢必有精度問題
pumping lemma會讓狀態機變成indefinite
你如果把IEEE754直接魔改成十進位 那就是科學記號而已
作者:
kiv9137 (AgN)
2022-01-21 17:10:00js一堆神奇的特例阿...
js那個不是特例 是語法糖 然後糖的背後就是惡夢..XD跟php早期一樣 很多人懶得處理type轉換的問題
js的compiler就是個病嬌 你給什麼她都硬吞
所以請愛用typescript :P最近我正在把整個團隊轉為typescript
作者:
kiv9137 (AgN)
2022-01-21 17:14:00最近我們公司的前端也在轉型TypeScript 該不會..
一定不是 因為我不是帶前端 是全端團隊...但這是一個大勢所趨 特別是不管vue/reactjs/angularnode生態系混亂夠久了 該有一個哲學出現了
作者: syk1104 (ONENO) 2022-01-21 17:16:00
笑死XD
作者: Kaneshiro (金城武) 2022-01-21 17:17:00
不是工程師也會知道好嗎==
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:18:00寫C的表示看不懂這個梗
float x = 0.1f; float y = 0.2f;
作者: SiWaAzu 2022-01-21 17:20:00
幹你js
作者:
kiv9137 (AgN)
2022-01-21 17:20:00我C#仔 我都直接decimal 我就爛 (攤手)
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:21:00倒是真的沒有看過6位後面的
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:21:00寫C/C++的更死好不好,你來寫金融軟體試試,少1毛錢都被罵死
應該說啦 你拿C寫科學運算照樣要考慮這問題fprintf基本上已經是砍過精度輸出char*啦沒有語言不會遇到這個問題的不信的話可以寫矩陣乘法然後不考慮精度給他一直乘
其實我想表達的是寫C通常不會用js, python那種打一行看結果的介面 所以不會有0.1+0.2(按Enter)0.300000004這種體驗 你真的去印而且故意印十幾位才會發現
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:24:00原來是這樣,不過寫C通常都FW,還真的很少碰浮點數
那只是fprintf的%d %f %s做掉啦...
如果是操作interrupt與ioctl是不太會遇到啦
浮點數還要看你拿來做啥,用float32計算金融會出大事
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:26:00當你客戶算出來的錢少1毛然後被罵到臭頭開始debug看的時候就會印出來一個個找了...
金融計算一律規定好精度到小數幾位之後乘以10^n用整數算 不要用小數去加減...
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:26:00今天學到了這個知識
至少以前我在中央信託局看到的db與code是這樣寫的XD影像運算?你是說傅立葉轉換嗎
影像處理其實就會出事了 算一個小區域的平均和標準差
然後你開GOOGLE按F12打一次就知道為什麼了w
不,那麼複雜的東西當然你要自己考慮好精度問題但如果你算個平均值還用double,一定會被電
標準差啊 可是是頻域還是空間域?因為影像的空間域都是整數啊....
就很單純的一個21x21區域內像素的標準差 沒用到頻率域
RGBA四channel?喔我大概知道意思了 是要算entropy?
用double會被電,用float32合理,但如果區域一片平坦
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:30:00@tsunami 金融相關追求精確度是這樣啦,但是有些應用求快,是真的在乎decimal/float運算速度差的就...
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:31:00剛剛測試了一下,變數0.1加上變數0.2 再乘上100000,後面就有值了平時還真的被printf屏蔽了雙眼
所以我一律閉著眼睛寫sqrtf(max(variance, 0.0f))
作者:
fman (fman)
2022-01-21 17:32:00靠北,第一眼看不懂,再看就知道是在講什麼,以前也有被搞過
作者:
fman (fman)
2022-01-21 17:33:00所以真的像上面版友一樣先轉string再用BigDecimal計算
variance變成負數的原因也跟0.30000000000000004一樣
作者:
hotrain13 (最幸é‹çš„人!!)
2022-01-21 17:35:00所以金融計算都是乘10^N 用正整數去算嗎?
我遇過的案例都是平均值和標準差一起算 這時就會用到
應該說我看到過這樣的解法 也許有專門寫這種系統的會有更方便的系統或者工具啦因為這樣可以一開始就規定好精度
Var(X) = E[X^2] - E[X]^2 後面還是需要浮點數然後常識告訴你這一定大於等於0 你就會被捅了另外如果你要算一張大圖的標準差時int32會撐不住
是啊 因為計算機無法處理整個實數域...所以數學上成立的式子不代表計算機算得出來...
作者:
vancepeng (urmomisbetter)
2022-01-21 17:38:00作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:40:00我自己用的類decimal class是用整數去算然後再顯示小數沒錯,可是看到過很多次其他人死在直接拿double在算
整數轉小數寫法還有一個隱藏風險 就是無論經驗多豐富的人也可能在寫昏頭之際 不小心對整數發動整數除法
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:41:00'float算出來有誤差,那就改用double啊' by職場前輩
我這邊是"給我一個你非得用double不可的理由"
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:48:00工作機會不知道,加班機會是很多...還好跑了
其實這一串討論的在那本紅色封面的"數值計算"課本都有但現在好像資工系都不太修那本了?
沒有type casting成職缺的工作機會就是加班囉
離散是計算理論部分 數值分析那本是講寫程式的時候怎麼樣處理數字精度的問題XD
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:55:00這年頭程式猴出生地很多種,不是只有資工就是了...另外實務上也遇過寫COBOL幾十年的客戶RD問為啥float有誤差問題,因為COBOL都是類似decimal的變數種類他們根本不知道有這問題
對啊 因為COBOL從一開始就是為了會計金融設計的XDD直接就要規定好精度了 畢竟算錢哪
作者:
seaEPC (沒看見,我沒看見 >_<)
2022-01-21 17:57:00解釋半天之後被回一句 C語言好爛 lol
c發明的時候從機械語言想要抽象化成數學語言的努力正是最熱切的時候哪 現在則是都是盡可能工程導向能用>>>>泛用這也是ECMAScript長成那樣的原因之一...本來沒有給人想要弄成多複雜的東西的...當初設計的人絕對不會想到vuejs那種東西wwwwfunctional? lambda? Javascipt!?
但8bit cpu年代IEEE754這種犧牲精度換值域的設計是必然
我就是說現在沒多少人記得的fortran...其實不管多大的register空間 精度永遠都有限制的..包括所謂的量子計算
作者:
qd6590 (說好吃)
2022-01-21 18:09:00我也笑了 幹
作者: as80110680 2022-01-21 18:22:00
這問題本質上是因為floot用二進制表達小數部分,只要沒辦法被2整除都會有精度問題,想要治本就是用10進制表達小數,部分語言也會提供這類class如c#的decimal*float
作者:
kiv9137 (AgN)
2022-01-21 18:29:00記得decimal在某些情況下會有誤差,但不是高精度似乎沒差不是高精度的計算*
作者: Electricfish 2022-01-21 18:30:00
所以這到底是哪款遊戲
作者: jurickson (小朱) 2022-01-21 18:36:00
氣死 之前被搞過
作者:
AlbX (Albina)
2022-01-21 18:50:00讀完這篇推文長了一堆知識XD
作者:
ap954212 (death is like the wings)
2022-01-21 18:58:00電腦連個十進位都不會
作者:
d970306 (d970306)
2022-01-21 19:03:00我碩論還真的是靠fortran算出來的,在部分科系還是有在用,不過不過快1年沒碰coding都忘了一大半了
作者:
kingroy (手殘總比腦殘好)
2022-01-21 19:06:00高階顯卡也一樣給你算錯
作者: hankoxide 2022-01-21 19:07:00
遊戲名:艾倫的自動機工坊
幹笑死XD,確實是工程師笑話xd,看完秒想到浮點數
作者:
Edaw (Wade)
2022-01-21 19:21:00推推 受教了
作者:
Coslate (Coslate)
2022-01-21 19:23:00文組嗎 連這都不知道
第一次聽說好像是以前修離散的時候XDfortran其實工程類還是在用啦,像我認識化工的有在用
作者:
spfy (spfy)
2022-01-21 19:35:00算錢用浮點 遲早被人扁
幹我計概和離散都修完完全沒聽過這東西,是教授教太簡單的意思哦
作者: rezoy0012 (Rasputin) 2022-01-21 19:53:00
是啊 以前計概都學過
作者: jason276 2022-01-21 20:03:00
計概教太簡單 離散不會教這個離散教的是實數沒辦法用有限的長度表示 不過跟這篇碰到的問題還沒有扯到那麼遠
作者:
xxxxae86 (éžæ´²å¤§è‰åŽŸ)
2022-01-21 20:07:00沒用 BigDecima
作者:
drink36 (爆肝小伙)
2022-01-21 20:12:00浮點數不要來亂啦
浮點數有這缺點 就是因為伴隨而來的優點真的太大了不過拿float32算錢一樣是要斷手斷腳的
作者:
ckkaze 2022-01-21 20:44:00算錢用浮點,遲早被人扁。 黑大說過要記得
作者:
ckkaze 2022-01-21 21:31:00拿上面那句喂狗就有了,長期追蹤的Blog
作者:
IKnowWhy (知道為什麼)
2022-01-21 21:53:00這什麼遊戲