diff options
Diffstat (limited to 'llgo/third_party/gofrontend/libgo/go/strconv/decimal.go')
| -rw-r--r-- | llgo/third_party/gofrontend/libgo/go/strconv/decimal.go | 117 |
1 files changed, 76 insertions, 41 deletions
diff --git a/llgo/third_party/gofrontend/libgo/go/strconv/decimal.go b/llgo/third_party/gofrontend/libgo/go/strconv/decimal.go index 42601283d23..5252d6e86eb 100644 --- a/llgo/third_party/gofrontend/libgo/go/strconv/decimal.go +++ b/llgo/third_party/gofrontend/libgo/go/strconv/decimal.go @@ -12,7 +12,7 @@ package strconv type decimal struct { - d [800]byte // digits + d [800]byte // digits, big-endian representation nd int // number of digits used dp int // decimal point neg bool @@ -102,16 +102,17 @@ func (a *decimal) Assign(v uint64) { } // Maximum shift that we can do in one pass without overflow. -// Signed int has 31 bits, and we have to be able to accommodate 9<<k. -const maxShift = 27 +// A uint has 32 or 64 bits, and we have to be able to accommodate 9<<k. +const uintSize = 32 << (^uint(0) >> 63) +const maxShift = uintSize - 4 -// Binary shift right (* 2) by k bits. k <= maxShift to avoid overflow. +// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow. func rightShift(a *decimal, k uint) { r := 0 // read pointer w := 0 // write pointer // Pick up enough leading digits to cover first shift. - n := 0 + var n uint for ; n>>k == 0; r++ { if r >= a.nd { if n == 0 { @@ -125,14 +126,14 @@ func rightShift(a *decimal, k uint) { } break } - c := int(a.d[r]) + c := uint(a.d[r]) n = n*10 + c - '0' } a.dp -= r - 1 // Pick up a digit, put down a digit. for ; r < a.nd; r++ { - c := int(a.d[r]) + c := uint(a.d[r]) dig := n >> k n -= dig << k a.d[w] = byte(dig + '0') @@ -169,50 +170,84 @@ func rightShift(a *decimal, k uint) { type leftCheat struct { delta int // number of new digits - cutoff string // minus one digit if original < a. + cutoff string // minus one digit if original < a. } var leftcheats = []leftCheat{ // Leading digits of 1/2^i = 5^i. // 5^23 is not an exact 64-bit floating point number, // so have to use bc for the math. + // Go up to 60 to be large enough for 32bit and 64bit platforms. /* - seq 27 | sed 's/^/5^/' | bc | - awk 'BEGIN{ print "\tleftCheat{ 0, \"\" }," } + seq 60 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\t{ 0, \"\" }," } { log2 = log(2)/log(10) - printf("\tleftCheat{ %d, \"%s\" },\t// * %d\n", + printf("\t{ %d, \"%s\" },\t// * %d\n", int(log2*NR+1), $0, 2**NR) }' */ {0, ""}, - {1, "5"}, // * 2 - {1, "25"}, // * 4 - {1, "125"}, // * 8 - {2, "625"}, // * 16 - {2, "3125"}, // * 32 - {2, "15625"}, // * 64 - {3, "78125"}, // * 128 - {3, "390625"}, // * 256 - {3, "1953125"}, // * 512 - {4, "9765625"}, // * 1024 - {4, "48828125"}, // * 2048 - {4, "244140625"}, // * 4096 - {4, "1220703125"}, // * 8192 - {5, "6103515625"}, // * 16384 - {5, "30517578125"}, // * 32768 - {5, "152587890625"}, // * 65536 - {6, "762939453125"}, // * 131072 - {6, "3814697265625"}, // * 262144 - {6, "19073486328125"}, // * 524288 - {7, "95367431640625"}, // * 1048576 - {7, "476837158203125"}, // * 2097152 - {7, "2384185791015625"}, // * 4194304 - {7, "11920928955078125"}, // * 8388608 - {8, "59604644775390625"}, // * 16777216 - {8, "298023223876953125"}, // * 33554432 - {8, "1490116119384765625"}, // * 67108864 - {9, "7450580596923828125"}, // * 134217728 + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 + {9, "37252902984619140625"}, // * 268435456 + {9, "186264514923095703125"}, // * 536870912 + {10, "931322574615478515625"}, // * 1073741824 + {10, "4656612873077392578125"}, // * 2147483648 + {10, "23283064365386962890625"}, // * 4294967296 + {10, "116415321826934814453125"}, // * 8589934592 + {11, "582076609134674072265625"}, // * 17179869184 + {11, "2910383045673370361328125"}, // * 34359738368 + {11, "14551915228366851806640625"}, // * 68719476736 + {12, "72759576141834259033203125"}, // * 137438953472 + {12, "363797880709171295166015625"}, // * 274877906944 + {12, "1818989403545856475830078125"}, // * 549755813888 + {13, "9094947017729282379150390625"}, // * 1099511627776 + {13, "45474735088646411895751953125"}, // * 2199023255552 + {13, "227373675443232059478759765625"}, // * 4398046511104 + {13, "1136868377216160297393798828125"}, // * 8796093022208 + {14, "5684341886080801486968994140625"}, // * 17592186044416 + {14, "28421709430404007434844970703125"}, // * 35184372088832 + {14, "142108547152020037174224853515625"}, // * 70368744177664 + {15, "710542735760100185871124267578125"}, // * 140737488355328 + {15, "3552713678800500929355621337890625"}, // * 281474976710656 + {15, "17763568394002504646778106689453125"}, // * 562949953421312 + {16, "88817841970012523233890533447265625"}, // * 1125899906842624 + {16, "444089209850062616169452667236328125"}, // * 2251799813685248 + {16, "2220446049250313080847263336181640625"}, // * 4503599627370496 + {16, "11102230246251565404236316680908203125"}, // * 9007199254740992 + {17, "55511151231257827021181583404541015625"}, // * 18014398509481984 + {17, "277555756156289135105907917022705078125"}, // * 36028797018963968 + {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936 + {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872 + {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744 + {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488 + {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976 } // Is the leading prefix of b lexicographically less than s? @@ -228,7 +263,7 @@ func prefixIsLessThan(b []byte, s string) bool { return false } -// Binary shift left (/ 2) by k bits. k <= maxShift to avoid overflow. +// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow. func leftShift(a *decimal, k uint) { delta := leftcheats[k].delta if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { @@ -237,11 +272,11 @@ func leftShift(a *decimal, k uint) { r := a.nd // read index w := a.nd + delta // write index - n := 0 // Pick up a digit, put down a digit. + var n uint for r--; r >= 0; r-- { - n += (int(a.d[r]) - '0') << k + n += (uint(a.d[r]) - '0') << k quo := n / 10 rem := n - 10*quo w-- |

