go ``` cmd/compile, types2: 考虑增加整数值的内部精度限制 ```

avwztpqn  于 3个月前  发布在  Go
关注(0)|答案(2)|浏览(18)

编译器限制无类型整数常量的最大位数为512位(实现限制)。它还对常数移位的移位计数有更高的限制。当前的移位限制设置为

const shiftBound = 1023 - 1 + 52

,这允许表达式

smallestFloat64 = 1.0 / (1<<(1023 - 1 + 52))

。然而,尽管移位计数检查成功,但由于在转换为无类型浮点数之前的整数值 1<<(1023 - 1 + 52) (超过了512位)导致移位结果溢出。
考虑将无类型整数常量的位限制提高到1100(或类似数字)。这样我们就可以精确地表示这些常数

smallestFloat64 = 1.0 / (1<<(1023 - 1 + 52))
maxFloat64 = 1<<1023 * (1<<53 - 1) / (1.0<<52)

(就像 go/constant 使用的有理数一样)。这个改变应该很简单,但可能会影响期望在较低边界处出现错误的测试。
如果进行了更改,应该在编译器( typecheck/constant/go )和 types2 ( expr.go )中进行。
cc: @mdempsky

nnsrf1az

nnsrf1az1#

https://golang.org/cl/315170提到了这个问题:math: increase precision of math.SmallestNonzeroFloat64

uelo1irk

uelo1irk2#

https://golang.org/cl/315969提到了这个问题:math: replace float32/64 extrema with exact expressions

相关问题