59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
|
|
/*
|
|||
|
|
* @Author : huangzj
|
|||
|
|
* @Time : 2020/12/30 15:11
|
|||
|
|
* @Description:
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
package go_cmp
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"github.com/google/go-cmp/cmp"
|
|||
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|||
|
|
"math"
|
|||
|
|
"testing"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type FloatPair struct {
|
|||
|
|
X float64
|
|||
|
|
Y float64
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestBasicFloat(t *testing.T) {
|
|||
|
|
//特殊的浮点数NaN(Not a Number),它与任何浮点数都不等,包括它自己
|
|||
|
|
p1 := FloatPair{X: math.NaN()}
|
|||
|
|
p2 := FloatPair{X: math.NaN()}
|
|||
|
|
fmt.Println("p1 equals p2?", cmp.Equal(p1, p2))
|
|||
|
|
|
|||
|
|
//受限于变量的存储空间,就会存在误差
|
|||
|
|
f1 := 0.1
|
|||
|
|
f2 := 0.2
|
|||
|
|
f3 := 0.3
|
|||
|
|
p3 := FloatPair{X: f1 + f2}
|
|||
|
|
p4 := FloatPair{X: f3}
|
|||
|
|
fmt.Println("p3 equals p4?", cmp.Equal(p3, p4))
|
|||
|
|
|
|||
|
|
//Go 语言中这些字面量的运算直接是在编译器完成的,所以同样的值虽然受限于变量的存储空间,但是结果是一样的.
|
|||
|
|
p5 := FloatPair{X: 0.1 + 0.2}
|
|||
|
|
p6 := FloatPair{X: 0.3}
|
|||
|
|
fmt.Println("p5 equals p6?", cmp.Equal(p5, p6))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//通过equal方法测试NaN返回结果一致
|
|||
|
|
func TestNanEqual(t *testing.T) {
|
|||
|
|
p1 := FloatPair{X: math.NaN()}
|
|||
|
|
p2 := FloatPair{X: math.NaN()}
|
|||
|
|
fmt.Println("p1 equals p2?", cmp.Equal(p1, p2, cmpopts.EquateNaNs()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//测试误差在一定的范围内 具体表示是:|x-y| ≤ max(fraction*min(|x|, |y|), margin)
|
|||
|
|
func TestCountError(t *testing.T) {
|
|||
|
|
f1 := 0.1
|
|||
|
|
f2 := 0.2
|
|||
|
|
f3 := 0.3
|
|||
|
|
p3 := FloatPair{X: f1 + f2}
|
|||
|
|
p4 := FloatPair{X: f3}
|
|||
|
|
fmt.Println(fmt.Sprintf("实际存储的值分别是:\n %v \n %v", p3.X, p4.X))
|
|||
|
|
fmt.Println("p3 equals p4?", cmp.Equal(p3, p4, cmpopts.EquateApprox(0.1, 0.001)))
|
|||
|
|
}
|