核心内容摘要
RTX 4090优化:2.5D转真人高清转换效果惊艳展示
关注我们,è®¾ä¸ºæ˜Ÿæ ‡,æ¯�天7:30ä¸�è§�ä¸�æ•£,æ¯�æ—¥java干货分享 浮点数ç�†æƒ³ä¸çš„“精密数å¦â€�在人类的直觉里å°�æ•°è¿�算是天ç»�地义的动作代ç �行数 (ç�†æƒ³çжæ€�)æ��述第一笔钱1 行double a
1;第二笔钱1 行double b
2;ç›¸åŠ 1 行double sum a b;判æ–1 行if (sum
0.
pay();结æ�œ-支付æˆ�功账目平é½�。ç�°å®�æ˜¯æ”¯ä»˜å¤±è´¥ã€‚å› ä¸ºsum的值是
30000000000000004ã€‚ä½ çš„ä»£ç �走进了一个平行宇宙那里
3 !
3。 第一关二进制的“翻译丢失� (IEEE
è¿™æ˜¯æ‰€æœ‰æµ®ç‚¹æ•°é—®é¢˜çš„æ ¹æº�。计算机是二进制的å�ªæœ‰ 0 å’Œ 1。人类是å��进制的
。�怖故事• 整数
5(�进制)
1(二进制)。这个能除尽没问题。• �数
1(�进制)
0.
..(二进制)。•å�‘ç�°äº†å�—å®ƒæ˜¯æ— é™�循ç�¯å°�æ•°å°±åƒ�ä½ æ²¡æ³•ç”¨â€œå��进制â€�精确表示1/3(
0.
..) ä¸€æ ·è®¡ç®—æœºä¹Ÿæ²¡æ³•ç”¨â€œäºŒè¿›åˆ¶â€�精确表示
1。它å�ªèƒ½æˆªæ–å˜ä¸€ä¸ªâ€œè¿‘似值â€�ã€‚å½“ä½ æŠŠä¸¤ä¸ªâ€œè¿‘ä¼¼å€¼â€�ç›¸åŠ è¯¯å·®å°±è¢«æ”¾å¤§äº†ã€‚ ç¬¬äºŒå…³æ¶ˆå¤±çš„å‡ åˆ†é’± (Financial Disaster)这是电商和金è��ç³»ç»Ÿæœ€å®¹æ˜“è¸©çš„é›·ã€‚åœºæ™¯ä½ åœ¨å�šä¸€ä¸ªç”µå•†å��å�°ã€‚商å“�ä»·æ ¼æ˜¯
1
90元用户买了3ä¸ªã€‚ä½ å†™äº†double total
1
90 * 3;æ��怖故事• ä½ çš„é¢„æœŸ
5
70。• 计算机的结�
5
699999999999996。��•�端展示用户看到了
59.
..è§‰å¾—ä½ ä»¬ç³»ç»Ÿæœ‰ Bug。•数æ�®åº“å˜å…¥å¦‚æ�œä½ 截å�–两ä½�å°�æ•°å˜å…¥å�¯èƒ½å�˜æˆ�了
5
69。少了 1 åˆ†é’±ã€‚â€¢è´¢åŠ¡å®¡è®¡ç´¯è®¡å‡ äº¿ç¬”è®¢å�•å��è´¦é�¢ä¸Šè�«å��å…¶å¦™å°‘äº†å‡ ç™¾ä¸‡ã€‚â€¢ç»“å±€ç¨‹åº�员被ç¥å¤©å› 为涉嫌“贪污â€�那消失的 1 分钱。♾ï¸� 第三关æ»å¾ªç�¯çš„陷阱 (The Infinite Loop)åœºæ™¯ä½ æƒ³å†™ä¸€ä¸ªå¾ªç�¯ä»� 0 开始æ¯�次åŠ
1直到ç‰äº� 1。for (double i 0; i !
0; i
0.
{ System.out.println(Running...); }æ��怖故事这个循ç�¯æ°¸è¿œä¸�会å�œæ¢ã€‚真相•i的值å�˜åŒ–• 0•
1•
2•
30000000000000004(这就是鬼故事的开始)• ...• 最�它会��
0.
..然�直�跳到
1.
..• 它永远ä¸�会精确地ç‰äº�
0。å��æ�œæœ�务器 CPU 100%线程å�¡æ»ã€‚ä½ éœ€è¦�é‡�å�¯æœ�务æ‰�能救活它。 第四关价值
7 亿�元的 Bug (Ariane
这是å�†å�²ä¸Šæœ€æ˜‚贵的浮点数事故。时间1996 å¹´ 6 月 4 日。事件欧洲航天局的阿里亚纳 5 å�·ç�«ç®é¦–é£�。结æ�œå�‘å°„å�� 37 ç§’ç�«ç®åœ¨ç©ºä¸è§£ä½“爆炸。代ç �真相程åº�试图把一个64 ä½�浮点数ç�«ç®çš„æ°´å¹³é€Ÿåº¦è½¬æ�¢æˆ�一个16 ä½�有符å�·æ•´æ•°ã€‚当时ç�«ç®é€Ÿåº¦å¤ªå¿«æµ®ç‚¹æ•°çš„值超过了 16 ä½�整数的最大范围32767。结æ�œæº¢å‡ºæŠ¥é”™ (Overflow)- å¯¼èˆªè®¡ç®—æœºæ»æœº - å¤‡ä»½è®¡ç®—æœºä¹Ÿæ»æœºè·‘的是å�Œä¸€å¥—代ç � - ç�«ç®å�¯åŠ¨è‡ªæ¯�程åº�。æ�Ÿå¤±
7 亿�元�间化为乌有。�♂� 第五关NaN 的僵尸病毒浮点数里有一个特殊值�NaN (Not a Number)。它比如
0 /
0或者Math.sqrt(-
会产生。æ��怖故事NaN 有一个æ��å…¶å��直觉的特性NaN ä¸�ç‰äº� NaN。if (x x)在 x 是 NaN 时结æ�œæ˜¯falseå��æ�œå¦‚æ�œä½ åœ¨ä¸€ä¸ªåˆ—è¡¨ä¸æ··å…¥äº†ä¸€ä¸ªNaNç„¶å��对列表进行æ�’åº�。æ�’åº�算法如 Timsortä¾�èµ–x y或x yçš„æ¯”è¾ƒé€»è¾‘ã€‚å› ä¸ºNaNè·Ÿè°�比都是错æ�’åº�å�¯èƒ½ä¼šå´©æºƒæˆ–者陷入æ»å¾ªç�¯æˆ–者æ�’出æ�¥çš„顺åº�是乱的。NaNå°±åƒ�åƒµå°¸ç—…æ¯’ä¸€æ—¦è¿›å…¥ä½ çš„æ•°æ�®æµ�所有的å��ç»è®¡ç®—都会å�˜æˆ�NaN。ï¸� 拆弹专家如何æ£ç¡®ç®—账既然浮点数这么ä¸�é� 谱我们该æ€�么åŠ�
金�计算严�使用 Float/Double涉�钱的地方必须使用高精度�数类。•Java:BigDecimal•Python:decimal.Decimal•SQL:DECIMAL(10,
æ£ç¡®å§¿åŠ¿// å�ƒä¸‡åˆ«ç”¨ new BigDecimal(
0.
å› ä¸ºå®ƒä¼šæŠŠ
1 的误差也å˜è¿›å�» // è¦�用 String æ�„é€ å™¨ BigDecimal a new BigDecimal(
0.
; BigDecimal b new BigDecimal(
0.
; BigDecimal sum a.add(b); // 结�真的是
0.
å�‘微的妥å��Epsilon 比较法如æ�œä½ é��è¦�用浮点数比如å�𿏏æˆ�ã€�图形å¦è®¡ç®—**永远ä¸�è¦�用**。è¦�判æ–两个数是å�¦â€œè¶³å¤Ÿæ�¥è¿‘â€�。æ£ç¡®å§¿åŠ¿double EPSILON
000001; if (Math.abs(a - b) EPSILON) { // 认为是相ç‰çš„ }
å�˜æˆ�æ•´æ•°å�•ä½�é™�级把“元â€�转æ�¢æˆ�“分â€�æ�¥å˜å‚¨ã€‚• å˜1990分而ä¸�是
1