From 8a39d8ac1b9dc322437bdc7afe2374183d47f2a9 Mon Sep 17 00:00:00 2001 From: baycore Date: Fri, 5 Dec 2025 19:26:28 +0800 Subject: [PATCH 1/3] Change diff calculation to use int64 Refactor difference calculation to use int64 for precision. --- decimal.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/decimal.go b/decimal.go index b48cfa9..cdc7a14 100644 --- a/decimal.go +++ b/decimal.go @@ -500,10 +500,13 @@ func (d Decimal) rescale(exp int32) Decimal { } // NOTE(vadim): must convert exps to float64 before - to prevent overflow - diff := math.Abs(float64(exp) - float64(d.exp)) + diff := int64(exp) - int64(d.exp) + if diff < 0 { + diff = -diff + } value := new(big.Int).Set(d.value) - expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) + expScale := new(big.Int).Exp(tenInt, big.NewInt(diff), nil) if exp > d.exp { value = value.Quo(value, expScale) } else if exp < d.exp { From b58cd95c7b588595b583bbf52455964d45f5a5e8 Mon Sep 17 00:00:00 2001 From: baycore Date: Fri, 5 Dec 2025 19:27:43 +0800 Subject: [PATCH 2/3] Update decimal.go --- decimal.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/decimal.go b/decimal.go index cdc7a14..da29f6a 100644 --- a/decimal.go +++ b/decimal.go @@ -501,9 +501,7 @@ func (d Decimal) rescale(exp int32) Decimal { // NOTE(vadim): must convert exps to float64 before - to prevent overflow diff := int64(exp) - int64(d.exp) - if diff < 0 { - diff = -diff - } + diff = int64(uint64(diff) &^ (1 << 63)) value := new(big.Int).Set(d.value) expScale := new(big.Int).Exp(tenInt, big.NewInt(diff), nil) From 47bef35cb5da83ca23e9d71d19f7b1849bf1bff6 Mon Sep 17 00:00:00 2001 From: baycore Date: Fri, 5 Dec 2025 19:34:49 +0800 Subject: [PATCH 3/3] Refactor overflow prevention in decimal.go --- decimal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decimal.go b/decimal.go index da29f6a..68faa1c 100644 --- a/decimal.go +++ b/decimal.go @@ -501,7 +501,7 @@ func (d Decimal) rescale(exp int32) Decimal { // NOTE(vadim): must convert exps to float64 before - to prevent overflow diff := int64(exp) - int64(d.exp) - diff = int64(uint64(diff) &^ (1 << 63)) + diff = (diff ^ (diff >> 63)) - (diff >> 63) value := new(big.Int).Set(d.value) expScale := new(big.Int).Exp(tenInt, big.NewInt(diff), nil)