func (v PreciseVector) Add(ov PreciseVector) PreciseVector {
	return PreciseVector{
		X: precAdd(v.X, ov.X),
		Y: precAdd(v.Y, ov.Y),
		Z: precAdd(v.Z, ov.Z),
	}
}
Add returns the standard vector sum of v and ov.
package r3
import (
	"fmt"
	"math/big"
)
const (
	prec = big.MaxPrec
)
var (
	precise0 = precInt(0)
	precise1 = precInt(1)
)
func precStr(s string) *big.Float {
	f, _ := new(big.Float).SetPrec(prec).SetString(s)
	return f
}
func precInt(i int64) *big.Float {
	return new(big.Float).SetPrec(prec).SetInt64(i)
}
func precFloat(f float64) *big.Float {
	return new(big.Float).SetPrec(prec).SetFloat64(f)
}
func precAdd(a, b *big.Float) *big.Float {
	return new(big.Float).SetPrec(prec).Add(a, b)
}
func precSub(a, b *big.Float) *big.Float {
	return new(big.Float).SetPrec(prec).Sub(a, b)
}
func precMul(a, b *big.Float) *big.Float {
	return new(big.Float).SetPrec(prec).Mul(a, b)
}
type PreciseVector struct {
	X, Y, Z *big.Float
}
func PreciseVectorFromVector(v Vector) PreciseVector {
	return NewPreciseVector(v.X, v.Y, v.Z)
}
func NewPreciseVector(x, y, z float64) PreciseVector {
	return PreciseVector{
		X: precFloat(x),
		Y: precFloat(y),
		Z: precFloat(z),
	}
}
func (v PreciseVector) Vector() Vector {
	x, _ := v.X.Float64()
	y, _ := v.Y.Float64()
	z, _ := v.Z.Float64()
	return Vector{x, y, z}.Normalize()
}
func (v PreciseVector) Equal(ov PreciseVector) bool {
	return v.X.Cmp(ov.X) == 0 && v.Y.Cmp(ov.Y) == 0 && v.Z.Cmp(ov.Z) == 0
}
func (v PreciseVector) String() string {
	return fmt.Sprintf("(%10g, %10g, %10g)", v.X, v.Y, v.Z)
}
func (v PreciseVector) Norm2() *big.Float { return v.Dot(v) }
func (v PreciseVector) IsUnit() bool {
	return v.Norm2().Cmp(precise1) == 0
}
func (v PreciseVector) Abs() PreciseVector {
	return PreciseVector{
		X: new(big.Float).Abs(v.X),
		Y: new(big.Float).Abs(v.Y),
		Z: new(big.Float).Abs(v.Z),
	}
}