English 中文(简体)
Floating point inaccuras example
原标题:Floating point inaccuracy examples

Locked. This question and its answers are locked because the question is off-topic but has historical significance. It is not currently accepting new answers or interactions.

How do you explain floating point inaccuracy to fresh programmers and laymen who still think computers are infinitely wise and accurate?
Do you have a favourite example or anecdote which seems to get the idea across much better than an precise, but dry, explanation?
How is this taught in Computer Science classes?

最佳回答

基本上有两个主要陷阱,即有浮动点的人。

  1. 比额表问题。 私营部门司的每个数字都有一个可观的数字,确定数字的总体“规模”,这样你就可以代表真正的小数值,或者代表真正的大数值,尽管你可以为此而投入的数位数有限。 加上两个不同的比额表,有时会使较小的比额表成为“轻率”,因为无法使之适应更大的规模。

    PS> $a = 1; $b = 0.0000000000000000000000001
    PS> Write-Host a=$a b=$b
    a=1 b=1E-25
    PS> $a + $b
    1
    

    作为一种类似情况,你可以看到一个大型游泳池和一排水。 两者规模都非常不同,但你可以单独轻易掌握它们大致多少。 然而,将oon湖输送到游泳池中,将使你仍然拥有一个全水的游泳池。

    (如果学习这种课程的人对指数表示不满,也可以使用<代码>1和1000000000

  2. 然后就有二进制和十进制表示的问题。像0.1这样的数字无法用有限的二进制位表示。不过有些语言掩盖了这一点。

    PS> "{0:N50}" -f 0.1
    0.10000000000000000000000000000000000000000000000000
    

    但是,你可以“充分”代表错误,把数字加在一起:

    PS> $sum = 0; for ($i = 0; $i -lt 100; $i++) { $sum += 0.1 }; $sum
    9,99999999999998
    

    不过,我想到的是一点类比,来适当解释这一点。 基本上,你代表<>1/3的问题只是为了获得你在小数点末无限期重复这三点所需的确切价值,才算出。

    同样,双轨分数对代表半年、季度、八年等物品而言是好的,但像第十类,将产生双位数的无限重复。

  3. 接下来还有另一个问题,尽管大多数人不 st,除非他们再做大量的数字 st。 但是,这些人已经知道这个问题。 由于许多浮动点数字只是确切数值的近似值,这意味着,对于一定数量f的某一近似值而言,可以肯定地看到更多的实际数字r>r,r>/em><>>>>>>,, > ......该数字准确显示同一近似值。 这些数字属于某种间隔。 请允许我指出,rminr这一结果的最低限度可能值:f<<<>>><><>>>>。 由此可见的r的最大可能价值,即: 间歇中的任何数字可以是您的实际人数r

    现在,如果你对这一数字进行计算——处理、支取、乘数等——就会失去准确性。 每一数字只是近似值,因此,你实际上用intervals进行计算。 其结果也是相互交织的,近似的差错只大得多,从而扩大了间隔。 你可以从这一计算得出一个数字。 但是,这只是one之间>的编号,其中考虑到您的原始歌剧的准确性和计算造成的准确损失。

    这类东西称为Interval arithmetic,至少对我来说,这是我们大学数学课程的一部分。

问题回答

显示基10系统受实际影响。 同一问题。

代表1/3作为第10基数中的代表 你们赢得的就是能够这样做的。

因此,如果你写“0.3333”的话,你会为许多使用案件提供合理的准确陈述。

但是,如果你把这个部分移回,你将获得“33/10000”,即而不是,与“1/3”相同。

其他部分,如1/2,在基数-10中很容易有明确代表性:“0.5”

现在,基2和基-10基本上都存在同样的问题:这两个问题都有一定数目可以准确反映。

虽然基数-10在基数-2中不存在1/10“0.1”的问题,但需要从“0.000110011”开始的限定代表性。

如何把这引诱给非军人。 计算机代表数字的一种方法是计算离散单位。 这些是数字计算机。 全部数字中,没有分数部分的现代数字计算机拥有两种权力:1、2、4、8、、地点价值、双位数、blah 、blah、blah。 对于分数,数字计算机的反向权力为2:1/2、1/4、1/8、......。 问题在于,很多人只能以数量有限的这些反常权力来代表。 采用更多的地方价值(更多的比值)将提高这些问题数目的精确度,但从来不确切,因为它只有少数的比值。 某些数目的比值有限。

Snooze...

在大韩民国,你想要测量集装箱中的水量,只有3个测量点:全堆积、半 c和小堆。 在计算最后全部保.之后,我要说,还有三分之一的保.。 然而,你可以衡量,因为它确实能够填充任何可用 cu。 它填补了一半的空缺,而从季度起的超支太小,无法填补任何问题。 因此,你有错误,即1/3到1/4之间的差额。 如果将这一错误与其他测量的错误结合起来,这一错误就更加复杂。

In python:

>>> 1.0 / 10
0.10000000000000001

如何解释在双亲中不能准确代表某些部分。 象一些分数(如1/3)一样,不能在基10中准确代表。

另一个例子是C。

printf (" %.20f 
", 3.6);

可信

3.60000 00008882

我在此简单地理解。

Problem: The value 0.45 cannot be accurately be represented by a float and is rounded up to 0.450000018. Why is that?

Answer: An int value of 45 is represented by the binary value 101101. In order to make the value 0.45 it would be accurate if it you could take 45 x 10^-2 (= 45 / 10^2.) But that’s impossible because you must use the base 2 instead of 10.

So the closest to 10^2 = 100 would be 128 = 2^7. The total number of bits you need is 9 : 6 for the value 45 (101101) + 3 bits for the value 7 (111). Then the value 45 x 2^-7 = 0.3515625. Now you have a serious inaccuracy problem. 0.3515625 is not nearly close to 0.45.

我们如何改善这种不准确之处? 我们可以把价值45和7改变为其他东西。

大约460×2^-10 = 0.44921875。 现在,你正在使用460秒的9比特和10秒的4比特。 之后,它更接近,但还没有接近。 然而,如果你最初的预估值为0.4921875,那么你就会得到确切的比照,而没有近似值。

So the formula for your value would be X = A x 2^B. Where A and B are integer values positive or negative. Obviously the higher the numbers can be the higher would your accuracy become however as you know the number of bits to represent the values A and B are limited. For float you have a total number of 32. Double has 64 and Decimal has 128.

如果一个转换为99999999999999999999999999999999999999,就可以观察到一个截断的缩影。 a <代码>float 和double。 结果是1 000 000 000美元,尽管这一数值明显接近9999999,即使99999999999999999999。 正确的子弹发至9999999。





相关问题
Haskell minimum/maximum Double Constant

Is there any way in Haskell to get the constant that is the largest and smallest possible positive rational number greater than zero that can be represented by doubles?

integer automatically converting to double but not float

I have a function like below: void add(int&,float&,float&); and when I call: add(1,30,30) it does not compile. add(1,30.0,30.0) also does not compile. It seems that in both cases, it ...

Lower Bounds For Floating Points

Are there any lower bounds for floating point types in C? Like there are lower bounds for integral types (int being at least 16 bits)?

Floating point again

Yesterday I asked a floating point question, and I have another one. I am doing some computations where I use the results of the math.h (C language) sine, cosine and tangent functions. One of the ...

热门标签