如何修复'(1<<100)*0.1和(1<<100)/10' [重复]
Posted
技术标签:
【中文标题】如何修复\'(1<<100)*0.1和(1<<100)/10\' [重复]【英文标题】:How to fix '(1<<100)*0.1 and (1<<100)/10' [duplicate]如何修复'(1<<100)*0.1和(1<<100)/10' [重复] 【发布时间】:2019-10-31 02:25:04 【问题描述】:在 A Tour of Go 中,Numeric Constants 部分的代码是
package main
import "fmt"
const (
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
// Shift it right again 99 places, so we end up with 1<<1, or 2.
Small = Big >> 99
)
func needInt(x int) int return x*10 + 1
func needFloat(x float64) float64 return x * 0.1
func main()
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
fmt.Println(Big * 0.1) //one
fmt.Println(Big / 10) //two
fmt.Println(Big*0.1)
输出1.2676506002282295e+29
,
但是fmt.Println(Big / 10)
抛出错误:constant 126765060022822940149670320537 overflows int
,
它们之间有什么区别。
【问题讨论】:
请阅读blog.golang.org/constants。总结:常数可以是任意精度/大。但有时必须将常量转换为真正的 Go 类型。在你的情况下,一个浮点数和一个整数。并非每个常量都可以转换,这是编译时错误。区别在于:Big*0.1
被转换为浮点数,而Big/10
被转换为 int。博文中的详细信息。
【参考方案1】:
来自constants 上的 Go 博客:
数值常量存在于任意精度的数值空间中;他们 只是常规数字。但是当它们被分配给一个变量时 值必须能够适合目的地。
举个例子可以更清楚地说明这一点:
const f = 1 << 31
x := f / 10 // what type is x?
y := f * 0.1 // what type is y?
fmt.Printf(" 10 : type = %8T\n", 10) // int
fmt.Printf("0.1 : type = %8T\n\n", 0.1) // float64
fmt.Printf(" x : type = %8T value = %v\n", x, x)
fmt.Printf(" y : type = %8T value = %v\n", y, y)
Playground 输出:
10 : type = int
0.1 : type = float64
x : type = int value = 214748364
y : type = float64 value = 2.147483648e+08
x
是 int
,因为除数 10
被解释为 int
。
y
是 float64
,因为乘数 0.1
被解释为 float64
。
在游览示例中,const 是1<<100
,它太大而无法放入int
(32 位),因此程序甚至无法编译,因为该数字无法存储到分配的内存类型:100 位不适合 32 位 int
。
【讨论】:
很想你,我明白了。 @joystrong 如果您喜欢问题的答案 - 不要忘记将其设为“已接受”(单击复选标记)以结束问题。以上是关于如何修复'(1<<100)*0.1和(1<<100)/10' [重复]的主要内容,如果未能解决你的问题,请参考以下文章