GoLang中形状区域的计算错误

时间:2016-10-06 01:48:20

标签: go

我有这段代码,假设打印单个形状的区域,然后打印总面积(各个区域的总和),但是当我使用接口和可变参数时,在添加的某处似乎存在问题功能。该程序是用GoLang编写的,下面是代码;

/* Program that interacts with shapes */

/* Calculating the area of basic shapes e.g Circle, Rectangle */

package main

import ("fmt"; "math")

/* Adding the interface support */
type Shape interface {
    area() float64
}

/* Struct for Circle */
type Circle struct {
    x, y, r float64
}

/* Struct for Rectangle */
type Rectangle struct {
    x1, y1, x2, y2 float64
}

/* Calculation of distance */
func distance(x1, y1, x2, y2 float64) float64 {
    a := x2 - x1
    b := y2 - y1
    return math.Sqrt(a*a + b*b)
}

/* Area of the rectangle */
func (r *Rectangle) area() float64 {
    l := distance(r.x1, r.y1, r.x1, r.y2)
    w := distance(r.x1, r.y1, r.x2, r.y1)

    return l * w
}

/* Area of the circle */
func (c *Circle) area() float64 {
    return math.Pi * c.r * c.r
}

/* Interface is really useful when finding the total area i.e. the sum of 
   all the areas of each of the shapes
*/
func totalArea(shapes ...Shape) float64 {
    var area float64
    for _, s := range shapes {
        area += s.area()
    }
    return area
}

/* This is the main function */
func main() {
    c := Circle{0, 0, 5}

    r := Rectangle{0, 0, 10, 10}

    fmt.Println("Area of the rectangle is: ", r.area())

    fmt.Println("Area of the circle is: ", c.area())

    fmt.Println("Sum of the areas: ", totalArea(&c, &r))
}

我在Mac OS X El Capitan上运行此代码,核心i5,8GB RAM以下是我的输出

Area of the rectangle is:  100
Area of the circle is:  78.53981633974483
Sum of the areas:  178.53981633974485

从结果中可以看出,存在一个小问题,预期的区域总和应为:178.53981633974483但我得178.53981633974485 0.00000000000002不同或偏离预期的结果,请任何人帮我解释为什么会这样?

我不太确定GoLang中的数学库是否存在问题,因为它只需要正常添加这两个区域?或者是GoLang在将该区域传递给totalArea()之前重新计算该区域然后做了一些近似我不太明白吗?或者是我的电脑(人们永远无法分辨)?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是浮点运算及其精度的行为,而不是golang特有的。

关于浮动精度的一些很好的资源。

这是一个片段,更简单地说明了您的问题:

https://play.golang.org/p/Jhlnt0L13T

如果您确实需要任意精度,那么您可能需要查看:

https://golang.org/pkg/math/big/