]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: round floats with a large negative exponent towards zero
authorJan Ziak <0xe2.0x9a.0x9b@gmail.com>
Mon, 24 Mar 2014 17:10:29 +0000 (10:10 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 24 Mar 2014 17:10:29 +0000 (10:10 -0700)
Fixes #6902

LGTM=iant
R=iant, rsc
CC=golang-codereviews
https://golang.org/cl/78730049

src/cmd/gc/mparith1.c
test/fixedbugs/issue6902.go [new file with mode: 0644]

index 19310a7c8c2701ea9beb03165af4472d634fa58e..a260a9964f51ec4f71fb0b87714815097d46b6cb 100644 (file)
@@ -427,7 +427,8 @@ mpatoflt(Mpflt *a, char *as)
                        mppow10flt(&b, ex-dp);
                        mpmulfltflt(a, &b);
                } else {
-                       if((short)(dp-ex) != dp-ex) {
+                       // 4 approximates least_upper_bound(log2(10)).
+                       if(dp-ex >= (1<<(8*sizeof(dp)-3)) || (short)(4*(dp-ex)) != 4*(dp-ex)) {
                                mpmovecflt(a, 0.0);
                        }
                        else {
diff --git a/test/fixedbugs/issue6902.go b/test/fixedbugs/issue6902.go
new file mode 100644 (file)
index 0000000..5c2c545
--- /dev/null
@@ -0,0 +1,21 @@
+// run
+
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 6902: confusing printing of large floating point constants
+
+package main
+
+import (
+       "os"
+)
+
+var x = -1e-10000
+
+func main() {
+       if x != 0 {
+               os.Exit(1)
+       }
+}