编译器限制无类型整数常量的最大位数为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
2条答案
按热度按时间nnsrf1az1#
https://golang.org/cl/315170提到了这个问题:
math: increase precision of math.SmallestNonzeroFloat64
uelo1irk2#
https://golang.org/cl/315969提到了这个问题:
math: replace float32/64 extrema with exact expressions