向客户解释浮点精度[关闭]


23

客户解释浮点舍入问题的最佳方法是什么?

我知道

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

以及针对开发人员和科学家的C ++ FAQ和其他各种页面中的条目,但是是否有针对具有有限数学或科学背景的“常规”客户的网页,文章或说明?(以上参考文献对此持平)。

如果它是维护的或来自知名的和公认的机构或公司,那么情况就更好了,因为正如您中某些人可能曾经经历过的那样,要解释自己可能有些复杂。


1
我不会打扰...
John Shaft

1
这是一个非常奇妙的问题,如果可以的话,请增加+10。开发人员经常遇到的问题。
科迪·格雷

2
这不是一个细节问题,它回答了为什么为什么要添加看起来为2个十进制数字的精度数字,结果却是5.9999999而不是6,以及为什么当结果“显而易见”时必须指定舍入精度” t有两个以上的十进制数字。或者为什么有时2减2并不总是为零,并且在这样做时看起来不像是个傻瓜傻瓜。
埃里克·格兰奇

9
@Eric Grange:如果您的客户认为这些精度问题是一个错误,那么那一个错误,您必须找到一种解决它的方法(也许不使用float)。他们不在乎这种精度问题的来源。他们不在乎您的软件如何工作。他们只是想要它工作。
大卫,

3
@Eric:使用浮点数一个实现细节。我重复我的问题,该问题不要求在问题中进行解释,并且我显然还不清楚(抱歉):背景是什么?为什么要与客户讨论使用浮点数?
汤姆·安德森

Answers:


8

我找到一种简单的方法来解释这一点,以证明这一点。讨论如何将x数字除以 然后再乘以相同的数字将使您x再次返回-让客户同意这种情况总是如此。然后(100 / 3) * 3用计算器做旧的事;表明该值不会像您期望的那样返回到100。当大多数人看到显然简单的数学“分解”时,则趋向于“冒”在精度很重要的地方浮点数的危险(尽管在直观上方式,而不是将您指向的文章介绍到较低的层次)。

不幸的是,如今大多数半体面的计算器(肯定是我所见过的所有科学计算器,并且超过了一些基本的计算器)都能够处理这个问题-我想他们正在存储超出显示和舍入范围之外的多余数字-这样做在您面对客户之前,请先检查您的计算器有多聪明。


1
是的,几乎所有计算器都至少存储了2个额外的数字,因此您必须在混合中添加几个乘法,这使解释变得混乱,而IME使他们认为您正在愚弄它们。平方根需要的操作更少,但是平方根已经超出了常规客户的日常范围。
埃里克·格兰奇

2
@Scott我在这里尝试了一些计算器,没有一个出现(100/3)* 3的问题,即使(100/3)* 3-100也没有出现问题。...Excel也正确。
埃里克·格兰奇

9
以金钱为例,它的精度有限。向您解释一下,您将一美元除以一美元,那么每个人将获得33美分,而四舍五入则损失一美分。任何人都可以与此相关。
印加

4
不要理会计算器。在纸上用1除以3,并保留三个有效数字。
David Thornley

5
@omegacentauri如果您认为解释对您有所帮助,我想您不经常与客户交流。
2011年

5

我认为没有捷径可走。您必须:

  • 了解什么是浮点及其行为。

或者,如果这太过需要,您只需要:

  • 接受计算机不会为您提供确切的数字结果。

也许与无理数的例子帮助(即使浮点问题也适用于有理数和)sqrt(2) ~ 1.414。然后1.414^2 = 1.999396。无论您使用多少位数字,都永远不会回到原始数字上2。好的,正确的4位有效数字是可以接受的,但是请考虑当这种“舍入误差”累积时会发生什么。那才是真正的危险所在。


2
我个人知道并理解,但是对于某些人来说,“浮点数”已经是一个陌生的术语,因此您需要的不仅仅是数学或科学解释,还需要说明他们可以正确地计算出什么,昂贵的计算机和软件很难正确地进行计算。 ;)平方根也超出了普通客户的日常范围。
埃里克·格兰奇

5

首先,确定他们在抱怨什么。必须使用正确的小数位数和正确的舍入规则精确地进行金融交易。这通常意味着维护货币单位的整数,并确保算法正确完成。

另外,他们可能抱怨显示过于精确,因此减少所有有效数字的输出可能是必要的。

对于一般的数字,您总是可以尝试使用三位数的十进制x来表示x * 3为10。这显示了基本原理。

剩下两个问题。一种是某些数字可以精确地用十进制表示,而不能用二进制表示(例如3.15)。这将很难向非技术人员解释,您最好的选择是尝试通过不提供足够多的有效数字来显示它来避免这种情况。另一个是了解一点的客户,足以知道计算机算术并不总是精确的,也不足以认识到十进制算术并不总是精确的。我已经与其中一些争论,没有什么可报告的。


3

计算机中的浮点数使用二进制,因此就像我们有一个包含一个,十个,数百个和十分之一,十分之一列的数字系统一样,计算机中的浮点数实际上具有一个,两个,四个和一半,四分之一和四分之一。第八列。如果客户熟悉英尺/英寸,请提醒他们通常如何使用以2为底的英寸为单位进行测量。

现在尝试将10美分存储为一半,四分之一,八分之一美元的组合。只是不起作用:

.00011001100110011。。。(无限重复

这与获取标准的英制卷尺并尝试测量十分之一英寸相同。您无法做到准确。没有将1/10表示为X / Y,其中X和Y是整数,Y是2的幂。

这就是为什么我们拥有使用4位存储每个十进制数字的十进制数据类型的原因,因此我们回到以10为基数的表示形式。需要权衡的是空间和性能(据我所读,大约有100%的性能下降)。


1

告诉他们,就像他们的银行帐户无法容纳4.4423425908459032890413 ...美元(即$ 4.44或$ 4.45,中间什么都没有)一样,计算机也不能轻易地以任意精度存储数字。存储的不完善会导致计算的不完善。

(这有点作弊,但是应该让他们知道问题出在哪里。)


2
that,这种解释是行不通的,因为当对所有数字都以两位开头的数字求和时,会出现精度问题。
埃里克·格兰奇

1
两位十进制数字。是的,我同意,一个好奇的客户会发现其中的漏洞。但你可以用二进制表示的讨论,击中了他们-他们自找的;-)
quant_dev

好了,已经在尝试解释它们的浮点了,IME立即开始认为您正在尝试使它们模糊不清,如果它以简单易懂的术语出现,或者来自知名机构或公司,则可以缓解。:)
埃里克·格兰奇

1
@Eric Math很难,让我们去打棒球吧:P
–quant_dev

1
询问是否精确到最接近的1/10“或最接近的毫米。后者更精确,但是精确到0.1”的倍数的对象将不是1mm的精确倍数,除非它们也是5英寸(精确为127mm)的精确倍数。将两个2.54mm物体的尺寸相加,精确到0.1“会产生0.2”的总和;将四舍五入到最接近毫米的尺寸相加会产生6mm,即使实际尺寸应为5.08毫米
supercat

1

2/3

要求他们写下确切的答案,然后除以2除以3。
既然答案“永远存在”,您可以指出。

使用1/3也可以,但是2/3可能是一个更好的示例,因为四舍五入为您提供了(例如).6666667,而.3333333看起来可以将其截断。


0

在进行计算时,计算机通常使用近似值(例如,不是使用1000000.7,而是使用1000000),因为使用近似值的速度要快得多。这样做的问题是,当您使用近似值进行计算时,您会获得近似值。通常效果很好,但有时会导致意外结果。


我真的不明白你在说什么。“因为使用近似值要快得多”?有时整数算术至少一样快,而且很精确。有时别无选择(例如打印2的平方根)。
大卫·桑利

好吧,您尝试向市场营销人员解释为什么计算机实际上不能代表无理数,或者在事物的宏伟计划中基本上不能代表任何数(哦,然后您可能想给他快速讲解\ pi的不理性:傅里叶级数可能很可爱)。近似是人们可以理解的词。您是从一个知道所有数字都不相等的人的观点出发的。

0

一些计算是根据某些法律规则进行的。例如,如果您要计算在德国应税的年收入79.245,18欧元必须缴纳多少所得税,那么只有一个正确的答案。正确或错误。如果操作正确,则无需解释浮点算法的工作原理。如果弄错了,则无需解释浮点算法的工作原理,而必须修复损坏的代码。

有时您显示的结果看起来不正确。例如,如果您将US $ 13,297.46转换为带有两位十进制数字的UK£,然后将该金额的UK£转换回US $,您可能不会获得US $ 13,297.46而是US $ 13,297.45或US $ 13,297.47。这与浮点算法无关。这是一个不可避免的问题,您最好能够解释为什么它不可避免。(您还应该知道,当您从UK£转换为USD并返回时,为什么不会出现此问题)。

还有其他可能看起来不正确的结果。如果将数字转换为百分比,则百分比的总和应为100%,但可能并非如此。如果使用两个小数显示四个百分比,则显示的四个百分比可能总计为99.99%或100.01%。与浮点运算无关。您仍然应该能够解释原因。

接下来,在某些情况下,粗心使用浮点算法会导致不适当的结果。例如,a + b + c通常与b + c + a不同。如果这引起了问题,则没有什么要解释的,这是您要解决的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.