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