当前位置: 首页 > 知识库问答 >
问题:

不同编程语言中的浮点数学

萧焱
2023-03-14

我知道浮点数学充其量是很难看的,但我想知道是否有人能解释下面的怪癖。在我测试的大多数编程语言中,将0.4加到0.2会产生轻微的误差,而0.4+0.1+0.1则表示不存在。

这两种计算结果不相等的原因是什么?在各自的编程语言中可以采取什么措施来获得正确的结果。

.4 + .2
0.6000000000000001
.4 + .1 + .1
0.6
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
Prelude> 0.4 + 0.2
0.6000000000000001    
Prelude> 0.4 + 0.1 + 0.1
0.6
> .4 + .2
[1] 0.6
> .4 + .1 + .1
[1] 0.6

共有1个答案

毛景曜
2023-03-14

所有这些语言都使用系统提供的浮点格式,它以二进制而不是十进制表示值。像0.20.4这样的值不能精确地以该格式表示,因此html" target="_blank">存储最接近的可表示值,从而导致一个小错误。例如,数值文字0.2会得到一个精确值为0.200000000000000011102230246251565404236316680908203125的浮点数。类似地,对浮点数进行的任何给定算术运算都可能导致一个无法精确表示的值,因此将真正的数学结果替换为最接近的可表示值。这些是你看到的错误的根本原因。

然而,这并不能解释语言之间的差异:在您的所有示例中,都进行了完全相同的计算,得到了完全相同的结果。不同之处在于不同语言选择显示结果的方式。

严格地说,你展示的答案没有一个是正确的。假设IEEE 754二进制64算法具有舍入到最近舍入模式(相当安全),则第一和的精确值为:

0.600000000000000088817841970012523233890533447265625
0.59999999999999997779553950749686919152736663818359375

计算并显示15个(或更少)正确舍入的有效数字。这具有隐藏十进制到二进制转换所涉及的错误的效果,给人一种精确十进制算术的错觉。它的缺点是不同的浮点可以具有相同的表示形式。这似乎是R正在做的事情。(感谢@Hadley在评论中指出,有一个R设置来控制用于显示的位数;默认值是使用7个有效数字。)

 类似资料:
  • 问题内容: 我知道浮点数学充其量可能很难看,但我想知道是否有人可以解释以下怪癖。在大多数编程语言中,我测试了0.4到0.2的添加会产生轻微的错误,而0.4 + 0.1 + 0.1会给出非错误。 计算不均的原因是什么,人们可以在相应的编程语言中采取什么措施以获得正确的结果。 在python2 / 3中 在Julia 0.3中也是如此 和Scala: 和Haskell: 但是R v3正确了: 问题答案

  • null 他们解释“如何”。我想知道为什么这些语言之间的差异。我期望在相同的输入下得到相似的结果。 test.js test.java 结果: 要旨:https://gist.github.com/reklis/6694AD5FB01991A79A1A

  • Go语言提供了两种精度的浮点数 float32 和 float64,它们的算术规范由 IEEE754 浮点数国际标准定义,该浮点数规范被所有现代的 CPU 支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数取值范围的极限值可以在 math 包中找到: 常量 math.MaxFloat32 表示 float32 能取到的最大数值,大约是 3.4e38; 常量 math.MaxFloat64

  • VB程序专用断点 bp __vbaStrCmp 比较字符串是否相等 bp __vbaStrComp 比较字符串是否相等 bp __vbaVarTstNe 比较变量是否不相等 bp __vbaVarTstEq 比较变量是否相等 bp __vbaStrCopy 复制字符串 bp __vbaStrMove 移动字符串 bp MultiByteToWideChar ANSI字符串转换成Unicode字符串

  • 1.1.4 汇编语言的主要特点 一方面,汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用CPU的资源,相对高级程序设计语言来说,它又显得难掌握。 汇编语言程序归纳起来大概有以下几个主要特性。 1、与机器相关性 汇编语言指令是机器指令的一种符号表示,而不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着

  • 问题内容: 我正在尝试使用包含大量16位浮点数的javascript读取二进制文件。可以肯定的是它是IEEE标准,低位字节序。将两个字节读入一个int非常简单,但是从那里将其扩展为一个完整的浮点数并没有太大的成功。有什么线索吗? 问题答案: 我最终根据Wikipedia页面上的信息实现了自己的解析器。它可能不是最快的,但是我对此不太担心。这里是那些好奇的人: