gpt4 book ai didi

go - 为什么浮点字面量和变量在 Go 中给出不同的结果?

转载 作者:IT王子 更新时间:2023-10-29 00:56:23 28 4
gpt4 key购买 nike

在下面的简单计算中,cd 最终得到不同的值(它们相差一位)。这是为什么?

a := 4000.0
b := 1e-9
c := a / b
d := 4000.0 / 1e-9

最佳答案

a 被赋予 4000.0 的下一个最佳值,表示为 float64,即 0x40AF400000000000 并且正好对应于 4000.0

b1e-9 的下一个最佳值,表示为 float64,即 0x3E112E0BE826D695 对应于 1.00000000000000006228159145778E-9。你在这里失去了精度。

所以在计算 c 之前你已经有一点不精确了。然后,当实际计算 c 时,您会因四舍五入而失去更多精度。

对于d,只有一个“next-besting”正在进行;当将 4000.0/1e-9 的编译时计算全精度值表示为 float64 时。

关于变量的旁白:在 C(可能还有 C++)中,默认情况下假设变量是非 volatile 的,即不共享,因此优化通常深入遵循常量表达式,用计算值替换所有内容。 Go 不对变量的范围做任何假设,因此不保证替换常量表达式。这在未来可能会改变,但今天,该部门所做的工作并不多,因此 c 很可能实际上是在运行时计算的,而不是像习惯 C 的人可能认为的那样在编译时计算。


编辑:我采用了@topskip提供的程序:

package main

import "fmt"

func main() {
a := 4000.0
b := 1e-9
c := a / b
d := 4000.0 / 1e-9
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
}

这是 go tool 6g -S 生成的程序集的一部分:

0x0021 00033 (meh.go:6) MOVSD   $f64.40af400000000000+0(SB),X2
0x002a 00042 (meh.go:7) MOVSD $f64.3e112e0be826d695+0(SB),X3
0x0033 00051 (meh.go:8) MOVAPD X2,X0
0x0037 00055 (meh.go:8) MOVSD X3,"".b+64(SP)
0x003d 00061 (meh.go:8) DIVSD X3,X0

如你所见; c 是在运行时根据我描述的两个常量计算的。

关于go - 为什么浮点字面量和变量在 Go 中给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256726/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com