首页 > 解决方案 > 减法 float64 小数似乎在 Go 中不起作用?

问题描述

我有一些需要高精度的代码,我正在尝试解决我认为由于在一系列计算期间舍入错误而发生的错误。在调试时,我在尝试从另一个 float64 中减去一个小的 float64 时遇到了一些奇怪的行为。

offset := width1 - 1.0
offsetY := rods[0].short_axis[1] * offset
y := rods[0].rotated_vertices[7]
y_adjusted := y - offsetY
fmt.Printf("offsetY = %.120f\n", offsetY)
fmt.Printf("original y = %.120f\n", y)
fmt.Printf("adjusted y = %.120f\n", y_adjusted)
fmt.Println()

offsetX := rods[0].short_axis[0] * offset
x := rods[0].rotated_vertices[6]
x_adjusted := x - offsetX
fmt.Printf("offsetX = %.120f\n", offsetX)
fmt.Printf("original x = %.120f\n", x)
fmt.Printf("adjusted x = %.120f\n", x_adjusted)
fmt.Println()

如果我运行上面的代码,我会得到以下输出

offsetY = -0.000000000000000192296268638356406290991112813876676018712131416808774897475586840300820767879486083984375000000000000000
original y = 3.183012701892220519539478118531405925750732421875000000000000000000000000000000000000000000000000000000000000000000000000
adjusted y = 3.183012701892220519539478118531405925750732421875000000000000000000000000000000000000000000000000000000000000000000000000

offsetX = 0.000000000000000111022302462515641716411522730772571691741167456465161356149451421515550464391708374023437500000000000000
original x = 0.852885682970025094107313634594902396202087402343750000000000000000000000000000000000000000000000000000000000000000000000
adjusted x = 0.852885682970024983085011172079248353838920593261718750000000000000000000000000000000000000000000000000000000000000000000

尽管offsetXoffsetY的量级相同,但这些计算中只有一个似乎有效。有谁知道可能是什么原因造成的?

标签: go

解决方案


我阅读了文档,我发现:“对于浮点值,宽度设置字段的最小宽度,精度设置小数点后的位数,如果合适的话,除了 %g/%G 精度设置最大值有效数字的数量(删除尾随零)。例如,给定 12.345,格式 %6.3f 打印 12.345,而 %.3g 打印 12.3。%e、%f 和 %#g 的默认精度为 6;对于 %g是唯一标识该值所需的最小位数。”

所以默认精度是 6。因为这不是语言问题,而是浮点数通常表示的问题。

为什么浮点数不准确?


推荐阅读