Я написал программу для демонстрации ошибки с плавающей запятой в Go:
func main() {
a := float64(0.2)
a += 0.1
a -= 0.3
var i int
for i = 0; a < 1.0; i++ {
a += a
}
fmt.Printf("After %d iterations, a = %e\n", i, a)
}
Он печатает:
After 54 iterations, a = 1.000000e+00
Это соответствует поведению той же самой программы, написанной на C (с использованием типа double
)
Однако, если вместо этого используется float32
, программа застревает в бесконечном цикле! Если вы измените программу C, чтобы использовать float
вместо double
, она печатает
After 27 iterations, a = 1.600000e+00
Почему при использовании float32
?