为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复“(1<<100)*0.1 和 (1<<100)/10”

如何修复“(1<<100)*0.1 和 (1<<100)/10”

Go
开心每一天1111 2023-07-31 16:33:05
在A Tour of Go 的Numeric Constants部分中,代码是package mainimport "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,它们之间有什么区别。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

来自关于常量的 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)

游乐场输出:


 10 : type =      int

0.1 : type =  float64


 x  : type =      int  value = 214748364

 y  : type =  float64  value = 2.147483648e+08

  • x是 anint因为 devisor10被解释为 an int

  • y是 afloat64因为乘数0.1被解释为 a float64

在游览示例中,const 是1<<100,它太大而无法放入int(32 位),因此程序甚至无法编译,因为该数字无法存储到分配的内存类型中:100 位无法放入32 位int.


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信