From 59df50a9fa42bd4135f578425a23301b25b49758 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Tue, 16 May 2023 16:34:25 +0800 Subject: [PATCH] RP @MjSeven https://linux.cn/article-15818-1.html --- ...ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) rename {translated/tech => published}/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md (88%) diff --git a/translated/tech/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md b/published/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md similarity index 88% rename from translated/tech/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md rename to published/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md index 637c53c9aa..312a09302c 100644 --- a/translated/tech/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md +++ b/published/20230208.3 â­ï¸â­ï¸â­ï¸ Why does 0.1 + 0.2 = 0.30000000000000004.md @@ -3,9 +3,9 @@ [#]: author: "Julia Evans https://jvns.ca/" [#]: collector: "lkxed" [#]: translator: "MjSeven" -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-15818-1.html" 为什么 0.1 + 0.2 = 0.30000000000000004? ====== @@ -28,7 +28,7 @@ - 把它们精确的数字加在一起 - 将结果四èˆäº”入到最接近的浮点数 -让我们用这些规则æ¥è®¡ç®— 0.1+0.2。我昨天æ‰åˆšäº†è§£æµ®ç‚¹åŠ æ³•çš„è®¡ç®—åŽŸç†ï¼Œæ‰€ä»¥åœ¨è¿™ç¯‡æ–‡ç« ä¸­æˆ‘å¯èƒ½çŠ¯äº†ä¸€äº›é”™è¯¯ï¼Œä½†æœ€ç»ˆæˆ‘å¾—åˆ°äº†æœŸæœ›çš„ç­”æ¡ˆã€‚ +让我们用这些规则æ¥è®¡ç®— 0.1 + 0.2。我昨天æ‰åˆšäº†è§£æµ®ç‚¹åŠ æ³•çš„è®¡ç®—åŽŸç†ï¼Œæ‰€ä»¥åœ¨è¿™ç¯‡æ–‡ç« ä¸­æˆ‘å¯èƒ½çŠ¯äº†ä¸€äº›é”™è¯¯ï¼Œä½†æœ€ç»ˆæˆ‘å¾—åˆ°äº†æœŸæœ›çš„ç­”æ¡ˆã€‚ #### 第一步:0.1 å’Œ 0.2 到底是多少 @@ -129,7 +129,7 @@ True $$\text{sign} \times 2^\text{exponent} (1 + \frac{\text{significand}}{2^{52}})$$ -例如,如果指数是 `1`,尾数是 `2^^51`,符å·ä½æ˜¯æ­£çš„,那么就å¯ä»¥å¾—到: +例如,如果指数是 `1`,尾数是 `2**51`,符å·ä½æ˜¯æ­£çš„,那么就å¯ä»¥å¾—到: $$2^{1} (1 + \frac{2^{51}}{2^{52}})$$ @@ -139,7 +139,7 @@ $$2^{1} (1 + \frac{2^{51}}{2^{52}})$$ 我用 Python 编写了一些(to 校正:这里原文加了一个 inefficient 形容è¯ï¼Œä¸çŸ¥é“如何翻译)函数æ¥èŽ·å–æ­£æµ®ç‚¹æ•°çš„æŒ‡æ•°å’Œå°¾æ•°: -```python +``` def get_exponent(f): # 获å–å‰ 52 个字节 bytestring = struct.pack('!d', f) @@ -191,7 +191,7 @@ def get_significand(f): 0.2 ``` -(顺便说一下,0.1 å’Œ 0.2 具有相åŒçš„å°¾æ•°å¹¶ä¸æ˜¯å·§åˆ —— 因为 `x` å’Œ `2*x` 总是有相åŒçš„尾数。) +(顺便说一下,0.1 å’Œ 0.2 具有相åŒçš„å°¾æ•°å¹¶ä¸æ˜¯å·§åˆ —— 因为 `x` å’Œ `2*x` 总是有相åŒçš„尾数。) #### 步骤 2ï¼šé‡æ–°è®¡ç®— 0.1 以获得更大的指数 @@ -231,7 +231,7 @@ def get_significand(f): 6305039478318695 ``` -棒。但是 `6305039478318695` 比 2**52-1(尾数的最大值)大,问题æ¥äº†: +棒。但是 `6305039478318695` 比 `2**52-1`(尾数的最大值)大,问题æ¥äº†: ``` >>> 6305039478318695 > 2**52 @@ -254,7 +254,7 @@ True 完美,但最åŽçš„ `2**(52 + 3)` éœ€è¦æ”¹ä¸º `2**(52 + 2)`。 -我们需è¦å°† 1801439850948199 除以 2。这就是难题的地方 -- `1801439850948199` 是一个奇数! +我们需è¦å°† `1801439850948199` 除以 2。这就是难题的地方 -- `1801439850948199` 是一个奇数! ``` >>> 1801439850948199 / 2 @@ -277,7 +277,7 @@ True #### 在硬件中它å¯èƒ½å¹¶ä¸æ˜¯è¿™æ ·å·¥ä½œçš„ -åœ¨ç¡¬ä»¶ä¸­åšæµ®ç‚¹æ•°åŠ æ³•ï¼Œä»¥ä¸Šæ“作方å¼å¯èƒ½å¹¶ä¸å®Œå…¨ä¸€æ¨¡ä¸€æ ·ï¼ˆä¾‹å¦‚ï¼Œå®ƒå¹¶ä¸æ˜¯æ±‚è§£ "X"ï¼‰ï¼Œæˆ‘ç›¸ä¿¡æœ‰å¾ˆå¤šæœ‰æ•ˆçš„æŠ€å·§ï¼Œä½†æˆ‘è®¤ä¸ºæ€æƒ³æ˜¯ç±»ä¼¼çš„。 +åœ¨ç¡¬ä»¶ä¸­åšæµ®ç‚¹æ•°åŠ æ³•ï¼Œä»¥ä¸Šæ“作方å¼å¯èƒ½å¹¶ä¸å®Œå…¨ä¸€æ¨¡ä¸€æ ·ï¼ˆä¾‹å¦‚ï¼Œå®ƒå¹¶ä¸æ˜¯æ±‚è§£ “Xâ€ï¼‰ï¼Œæˆ‘ç›¸ä¿¡æœ‰å¾ˆå¤šæœ‰æ•ˆçš„æŠ€å·§ï¼Œä½†æˆ‘è®¤ä¸ºæ€æƒ³æ˜¯ç±»ä¼¼çš„。 #### æ‰“å°æµ®ç‚¹æ•°æ˜¯éžå¸¸å¥‡æ€ªçš„ @@ -292,13 +292,13 @@ True 计算机实际上并没有打å°å‡ºæ•°å­—的精确值,而是打å°å‡ºäº†*最短*çš„å进制数 `d`,其中 `f` 是最接近 `d` 的浮点数。 -äº‹å®žè¯æ˜Žï¼Œæœ‰æ•ˆåšåˆ°è¿™ä¸€ç‚¹å¾ˆä¸ç®€å•,有很多关于它的学术论文,比如[å¿«é€Ÿä¸”å‡†ç¡®åœ°æ‰“å°æµ®ç‚¹æ•°][1]ã€[å¦‚ä½•å‡†ç¡®æ‰“å°æµ®ç‚¹æ•°][2]等。 +äº‹å®žè¯æ˜Žï¼Œæœ‰æ•ˆåšåˆ°è¿™ä¸€ç‚¹å¾ˆä¸ç®€å•,有很多关于它的学术论文,比如 [å¿«é€Ÿä¸”å‡†ç¡®åœ°æ‰“å°æµ®ç‚¹æ•°][1]ã€[å¦‚ä½•å‡†ç¡®æ‰“å°æµ®ç‚¹æ•°][2] 等。 #### 如果计算机打å°å‡ºæµ®ç‚¹æ•°çš„精确值,会ä¸ä¼šæ›´ç›´è§‚一些? å››èˆäº”入到一个干净的å进制值很好,但在æŸç§ç¨‹åº¦ä¸Šï¼Œæˆ‘è§‰å¾—å¦‚æžœè®¡ç®—æœºåªæ‰“å°ä¸€ä¸ªæµ®ç‚¹æ•°çš„精确值å¯èƒ½ä¼šæ›´ç›´è§‚ -- 当你得到一个奇怪的结果时,它å¯èƒ½ä¼šè®©ä½ çœ‹èµ·æ¥ä¸é‚£ä¹ˆæƒŠè®¶ã€‚ -对我æ¥è¯´ï¼Œ0.1000000000000000055511151231257827021181583404541015625 + 0.200000000000000011102230246251565404236316680908203125 = 0.3000000000000000444089209850062616169452667236328125比0.1 + 0.2 = 0.30000000000000000004 惊讶少一点。 +对我æ¥è¯´ï¼Œ`0.1000000000000000055511151231257827021181583404541015625 + 0.200000000000000011102230246251565404236316680908203125 = 0.3000000000000000444089209850062616169452667236328125` 比 `0.1 + 0.2 = 0.30000000000000000004` 惊讶少一点。 这也许是一个å主æ„,因为它肯定会å ç”¨å¤§é‡çš„å±å¹•空间。 @@ -306,7 +306,7 @@ True 有人在评论中指出在 PHP 中 `` 会输出 `0.3`,这是å¦è¯´æ˜Žåœ¨ PHP 中浮点è¿ç®—ä¸ä¸€æ ·ï¼Ÿ -éžä¹Ÿ -- 我在[这个链接][3]中è¿è¡Œ: +éžä¹Ÿ —— 我在 [这里][3] è¿è¡Œ: ``,得到了与 Python 完全相åŒçš„答案:5.5511151231258E-17。因此,浮点è¿ç®—çš„åŸºæœ¬åŽŸç†æ˜¯ä¸€æ ·çš„。 @@ -316,6 +316,8 @@ True æˆ‘æœ‰ç‚¹æ€€ç–‘æ˜¯å¦æœ‰äººèƒ½è€å¿ƒå®Œæˆä»¥ä¸Šæ‰€æœ‰äº›ç®—术,但它写出æ¥å¯¹æˆ‘很有帮助,所以我还是å‘表了这篇文章,希望它能有所帮助。 +*(题图:MJ/53e9a241-14c6-4dc7-87d0-f9801cd2d7ab)* + -------------------------------------------------------------------------------- via: https://jvns.ca/blog/2023/02/08/why-does-0-1-plus-0-2-equal-0-30000000000000004/ @@ -323,7 +325,7 @@ via: https://jvns.ca/blog/2023/02/08/why-does-0-1-plus-0-2-equal-0-3000000000000 作者:[Julia Evans][a] 选题:[lkxed][b] 译者:[MjSeven](https://github.com/MjSeven) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) è£èª‰æŽ¨å‡º @@ -332,3 +334,4 @@ via: https://jvns.ca/blog/2023/02/08/why-does-0-1-plus-0-2-equal-0-3000000000000 [1]: https://legacy.cs.indiana.edu/~dyb/pubs/FP-Printing-PLDI96.pdf [2]: https://lists.nongnu.org/archive/html/gcl-devel/2012-10/pdfkieTlklRzN.pdf [3]: https://replit.com/languages/php_cli +[0]: https://img.linux.net.cn/data/attachment/album/202305/16/162904pp51u5nsemd14pp2.jpg \ No newline at end of file