- python - 如何按类查找元素
- javascript - 如何使用 jQuery 设置输入文本的值
- html - 如何使文本输入不可编辑?
- html - 如何忽略 tabindex 中的 HTML 元素?
我知道 float 学充其量是丑陋的,但我想知道是否有人可以解释以下怪癖。在我测试的大多数编程语言中,将 0.4 添加到 0.2 会产生轻微错误,而 0.4 + 0.1 + 0.1 则不会。
两者计算不等的原因是什么,以及在各自的编程语言中可以采取哪些措施来获得正确的结果。
在python2/3中
.4 + .2
0.6000000000000001
.4 + .1 + .1
0.6
同样的情况发生在 Julia 0.3
julia> .4 + .2
0.6000000000000001
julia> .4 + .1 + .1
0.6
和斯卡拉:
scala> 0.4 + 0.2
res0: Double = 0.6000000000000001
scala> 0.4 + 0.1 + 0.1
res1: Double = 0.6
和 Haskell:
Prelude> 0.4 + 0.2
0.6000000000000001
Prelude> 0.4 + 0.1 + 0.1
0.6
但是 R v3 做对了:
> .4 + .2
[1] 0.6
> .4 + .1 + .1
[1] 0.6
最佳答案
所有这些语言都使用系统提供的浮点格式,它以二进制而不是十进制表示值。 0.2
和 0.4
之类的值无法以该格式精确表示,因此存储了最接近的可表示值,从而导致小错误。例如,数字文字 0.2
会产生一个 float ,其精确值为 0.200000000000000011102230246251565404236316680908203125
。类似地,对 float 的任何给定算术运算都可能导致无法精确表示的值,因此将真正的数学结果替换为最接近的可表示值。这些是您所看到的错误的根本原因。
但是,这并不能解释语言之间的差异:在您的所有示例中,都进行了完全相同的计算并得出了完全相同的结果。不同之处在于各种语言选择显示结果的方式。
严格来说,没有一个您给出的答案是正确的。使用四舍五入模式对 IEEE 754 二进制 64 算法进行(相当安全)假设,第一个和的确切值为:
0.600000000000000088817841970012523233890533447265625
而第二个总和的确切值为:
0.59999999999999997779553950749686919152736663818359375
但是,这些输出都不是特别用户友好的,而且很明显,您测试的所有语言都做出了在打印时缩写输出的明智决定。但是,它们并非都采用相同的策略来格式化输出,这就是您看到差异的原因。
有许多可能的格式化策略,但三种特别常见的策略是:
计算并显示 17 个正确舍入的有效数字,可能会去除它们出现的尾随零。 17 位的输出保证了不同的 binary64 float 将具有不同的表示,因此可以从其表示中明确地恢复浮点值; 17 是具有此属性的最小整数。例如,这就是 Python 2.6 使用的策略。
计算并显示在通常舍入到偶数舍入模式下舍入到给定 binary64 值的最短十进制字符串。这比策略 1 实现起来要复杂得多,但保留了不同的 float 具有不同表示的属性,并且倾向于产生更愉快的输出。这似乎是您测试的所有语言(R 除外)都在使用的策略。
计算并显示 15 个(或更少)正确舍入的有效数字。这具有隐藏十进制到二进制转换中涉及的错误的效果,给人一种精确十进制算术的错觉。它的缺点是不同的 float 可以具有相同的表示。这似乎是 R 正在做的事情。 (感谢@hadley 在评论中指出 R setting 控制用于显示的位数;默认使用 7 位有效数字。)
关于python - 不同编程语言中的 float 学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21872854/
有人尝试过两者J编程语言形式 jsoftware 和 R语言。经过一番搜索后,我遇到了 incanter这是基于 Clojure 的。我想学习一种用于数据分析的统计语言。你更倾向哪个?为什么? 请考虑
有谁知道我在哪里可以找到 NesC 编程语言的基础和高级教程和代码示例。 最好的问候 最佳答案 在这里您可以找到许多示例和许多其他文档。 http://docs.tinyos.net 关于NesC 编
我断断续续地玩 MUD 游戏已经一年多了。我在网上搜索了最好的计算机语言来学习开发我自己的语言。到目前为止,我除了 C 什么都没有想出。C 是学习此应用程序的最佳语言,还是有更好的语言? 我知道 SM
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我对编码有点陌生,可能不会使用正确的术语,希望我说的有道理。 我创建了一个类模块来构建对象。我的类模块当前有一些变量(我打算在构建代码时添加一些方法)。 'CLASS MODULE NAMED cls
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
问题:这个代码示例有什么问题,缺少什么? 当前不正确的输出是: “”中有0个字 代码说明:编写一个程序,读取一行文本,并打印出该行文本中的字数。单词包含字母数字字符。提示:使用 fgets() 函数。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
任何人都可以回答如何在 GO 中获取系统时间来帮助我。例如,在下面的代码中,我想知道第一次打印和第二次打印语句何时执行,它们之间的时间差是多少。 package main import "fmt" f
Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
在过去的几年里,我一直在做大量的 SIMD 编程,而且大部分时间我一直依靠编译器的内在函数(例如用于 SSE 编程的那些)或编程汇编来获得真正漂亮的东西。然而,到目前为止,我几乎找不到任何内置支持 S
当我尝试使用 watir-webdriver 步骤定义运行 Cucumber 场景时,出现以下错误: Failed to load 'yml' programming language for fil
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我想知道是否有一种编程语言可以编译为机器代码/二进制(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的),具有动态和/或弱类型,例如: 想想一种编译语言,其中: 变量不需要声明 可以在运行时
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我是一名优秀的程序员,十分优秀!