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

在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,它们之间有什么区别。


开心每一天1111
浏览 82回答 1
1回答

沧海一幻觉

来自关于常量的 Go :数字常量存在于任意精度的数字空间中;它们只是普通数字。但是,当将它们分配给变量时,该值必须能够适合目标。一个例子可能会让这一点更清楚:const f = 1 << 31x := f / 10  // what type is x?y := f * 0.1 // what type is y?fmt.Printf(" 10 : type = %8T\n", 10)    // intfmt.Printf("0.1 : type = %8T\n\n", 0.1) // float64fmt.Printf(" x  : type = %8T  value = %v\n", x, x)fmt.Printf(" y  : type = %8T  value = %v\n", y, y)游乐场输出: 10 : type =      int0.1 : type =  float64 x  : type =      int  value = 214748364 y  : type =  float64  value = 2.147483648e+08x是 anint因为 devisor10被解释为 an int。y是 afloat64因为乘数0.1被解释为 a float64。在游览示例中,const 是1<<100,它太大而无法放入int(32 位),因此程序甚至无法编译,因为该数字无法存储到分配的内存类型中:100 位无法放入32 位int.
打开App,查看更多内容
随时随地看视频慕课网APP