楼主:
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这什么游戏