如何修复'(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

xint,因为除数 10 被解释为 intyfloat64,因为乘数 0.1 被解释为 float64

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

【讨论】:

很想你,我明白了。 @joystrong 如果您喜欢问题的答案 - 不要忘记将其设为“已接受”(单击复选标记)以结束问题。

以上是关于如何修复'(1<<100)*0.1和(1<<100)/10' [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python如何微秒级延时?

有关遗传算法的疑问:“以一定概率进行交叉和变异”的含义?

具有较高尾数的fp如何表示较小的数字?

Xcode 7.0.1 - 无效的 Swift 支持 - cocoapods 如何修复?

为啥 1 // 0.1 == 9.0? [复制]

MATLAB和Python解线性规划