Skip to content

Commit

Permalink
Remove all SNan Panics
Browse files Browse the repository at this point in the history
  • Loading branch information
joshcarp committed Mar 25, 2019
1 parent bc488e6 commit e7229b3
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 18 deletions.
14 changes: 3 additions & 11 deletions decimal64math.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,22 +74,19 @@ func (d Decimal64) Cmp(e Decimal64) int {
func (d Decimal64) Mul(e Decimal64) Decimal64 {
flavor1, sign1, exp1, significand1 := d.parts()
flavor2, sign2, exp2, significand2 := e.parts()

if flavor1 == flSNaN || flavor2 == flSNaN {
return signalNaN64()
return SNaN64
}
if flavor1 == flQNaN || flavor2 == flQNaN {
return QNaN64
}

sign := sign1 ^ sign2
if d == Zero64 || d == NegZero64 || e == Zero64 || e == NegZero64 {
return zeroes[sign]
}
if flavor1 == flInf || flavor2 == flInf {
return infinities[sign]
}

exp := exp1 + exp2 + 15
significand := umul64(significand1, significand2).div64(decimal64Base)
exp, significand.lo = renormalize(exp, significand.lo)
Expand All @@ -108,14 +105,12 @@ func (d Decimal64) Neg() Decimal64 {
func (d Decimal64) Quo(e Decimal64) Decimal64 {
flavor1, sign1, exp1, significand1 := d.parts()
flavor2, sign2, exp2, significand2 := e.parts()

if flavor1 == flSNaN || flavor2 == flSNaN {
return signalNaN64()
return SNaN64
}
if flavor1 == flQNaN || flavor2 == flQNaN {
return QNaN64
}

sign := sign1 ^ sign2
if d == Zero64 || d == NegZero64 {
if e == Zero64 || e == NegZero64 {
Expand All @@ -132,11 +127,9 @@ func (d Decimal64) Quo(e Decimal64) Decimal64 {
if flavor2 == flInf {
return zeroes[sign]
}

if e == Zero64 || e == NegZero64 {
return infinities[sign1]
}

exp := exp1 - exp2 - 16
significand := umul64(10*decimal64Base, significand1).div64(significand2)
exp, significand.lo = renormalize(exp, significand.lo)
Expand All @@ -159,10 +152,9 @@ func (d Decimal64) Sqrt() Decimal64 {
case flQNaN:
return d
case flSNaN:
return signalNaN64()
return SNaN64
case flNormal:
}

if significand == 0 {
return d
}
Expand Down
7 changes: 0 additions & 7 deletions decimal64math_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,6 @@ func TestDecimal64MulNaN(t *testing.T) {

require.Equal(QNaN64, fortyTwo.Mul(QNaN64))
require.Equal(QNaN64, QNaN64.Mul(fortyTwo))

require.Panics(func() { fortyTwo.Mul(SNaN64) })
require.Panics(func() { SNaN64.Mul(fortyTwo) })
}

func TestDecimal64MulInf(t *testing.T) {
Expand Down Expand Up @@ -219,8 +216,6 @@ func TestDecimal64QuoNaN(t *testing.T) {
require.Equal(QNaN64, fortyTwo.Quo(QNaN64))
require.Equal(QNaN64, QNaN64.Quo(fortyTwo))

require.Panics(func() { fortyTwo.Quo(SNaN64) })
require.Panics(func() { SNaN64.Quo(fortyTwo) })
}

func TestDecimal64QuoInf(t *testing.T) {
Expand Down Expand Up @@ -281,9 +276,7 @@ func TestDecimal64SqrtNeg(t *testing.T) {

func TestDecimal64SqrtNaN(t *testing.T) {
require := require.New(t)

require.Equal(QNaN64, QNaN64.Sqrt())
require.Panics(func() { SNaN64.Sqrt() })
}

func TestDecimal64SqrtInf(t *testing.T) {
Expand Down

0 comments on commit e7229b3

Please sign in to comment.