go - 减法 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
尽管offsetX
和offsetY
的量级相同,但这些计算中只有一个似乎有效。有谁知道可能是什么原因造成的?
解决方案
我阅读了文档,我发现:“对于浮点值,宽度设置字段的最小宽度,精度设置小数点后的位数,如果合适的话,除了 %g/%G 精度设置最大值有效数字的数量(删除尾随零)。例如,给定 12.345,格式 %6.3f 打印 12.345,而 %.3g 打印 12.3。%e、%f 和 %#g 的默认精度为 6;对于 %g是唯一标识该值所需的最小位数。”
所以默认精度是 6。因为这不是语言问题,而是浮点数通常表示的问题。
推荐阅读
- c# - 如何用下拉列表过滤,我迷路了。ASP.NET
- python - 原点的主要网格线未显示在 matplotlib 中
- javascript - 在 react-native 中单击登录时如何设置状态?
- python - 使用元组元素创建 3d np 数组
- javascript - Display div with a hint only if one specific option is chosen/active. AngularJS
- python - lightgbm 的importance_type 'split' 和xgboost 中的importance_type 'weight` 一样吗?
- java - 创建 BitSet 的 toByteArray 方法(错误的字节顺序)
- javascript - 算法可以达到的最远建筑物 - JavaScript
- javascript - 你能用不同的数据处理选项重新“初始化”一个 Facebook 像素吗?
- api - API Get 请求在网络外被阻止