我有相当大的数据文件,需要将第二列乘以-1 awk命令如下所示:

awk '{printf "%.4f  %.16f\n", $1, $2*-1}' file > file_reverted

这在某些行中工作得很好,但是在某些行中,它以某种方式在末尾四舍五入,而不是仅添加0。

精细:

-0.094  0.0950083965247825  |  -0.0940  -0.0950083965247825
-0.0935 0.104569121568904   |  -0.0935  -0.1045691215689040
-0.093  0.114995049351066   |  -0.0930  -0.1149950493510660       

错误:

-0.0795 1.08856685504934    |  -0.0795  -1.0885668550493399
-0.079  1.16919985559016    |  -0.0790  -1.1691998555901599

小数点后16位不是什么大问题,但仍然使我的结果有些虚假。

#1楼 票数:3 已采纳

首先,阅读每个程序员应该了解的浮点算法 或者,如果您愿意, 计算机科学家应该对浮点算术了解多少

您看到的是(-)1.0885668550493399还是(-)1.08856685504934与您执行的操作无关。 除符号外, 数字相同

$ echo 1.08856685504934 | awk '{printf "%.16f %.16f\n", $1, -$1}'      
1.0885668550493399 -1.0885668550493399

发生的情况是,您打印的数字比存储的数字更精确。 打印的数字之间的差为10 -16 ,小于数字的2 -52倍,因此在awk浮点数的52位尾数中无法表达。 这对于在打印和解析的各个阶段保持精度是必要的1.08856685504933991.08856685504934是相同数字的表示。

您的结果并未被伪造。 您得到相同的结果。 确保计算结果的精度-它可能比浮点值的52位精度低很多,因为计算的每个阶段都会进行一些舍入。

#2楼 票数:1

如果您不需要更改与输入相比的小数位数,则应该可以这样做:

awk '{if($2<0){gsub(/-/,"",$2)}else if($2>0){$2="-"$2};print $1,$2}'

不显示数字的浮点表示,摆脱了精度问题。

  ask by Ueffes translate from so

未解决问题?本站智能推荐:

1回复

AWK将列的所有值求和,并保持所有浮点数

我正在使用以下代码grep我感兴趣的行,仅保留最后一行,并对第九列求和: 但是,第9列的总和返回0,000 选定的行如下所示 我找不到错误在哪里。 我也试图求和超过1美元,我正确地获得了792,000,但是当我超过3美元时,我得到了31,000 ... 怎么了?
4回复

使用awk减去浮点数

我有一个bash脚本,它用awk从较大的数字中减去0.0001。 当数字的位数超过四个小数时,它将不起作用。 它使用这些参数来警告... 如果$balance等于1.44189949则数字最终为1.4418 ,它必须为1.44179949所以我做错了什么。 我以前从未在bash中处
1回复

使用awk重新格式化浮点数

我想匹配输入中的所有浮点数,并用其他格式的浮点数替换它们。 这是我尝试过的方法: 不幸的是,sprintf中的"&"是字符串而不是数字,因此结果是: 那是我想要的数字格式,但是使用"&"会导致参数的值是零,而不是匹配的数字。 将"%E"格式更改为"%s"工作方式是
1回复

使用%d会在Awk程序中给出奇怪的舍入值

当我在某些记录集上执行求和时,我得到了奇怪的答案。 在一种情况下,我没有使用%d,在下一种情况下我使用的是%d 使用%d之和的第一个表达式 没有%d 为什么它从34变为33 只是添加更多信息,直到34行我得到的总和为33.03而第35行的值为0.97所以实际上它应该是34而不是
1回复

为什么AWK拒绝总结花车

我现在面临一个相当奇怪的问题awk ,我想计算列的平均值。 这是我的文件的测试输入: 这是我正在尝试运行的脚本: 我期望的输出是: 但这是我总是得到的: 我已经检查了输入文件的格式和字符等,但我不能得到awk总结那些讨厌的浮动。 有任何想法吗? 我在OS X 10.8.
2回复

除以awk浮动

我编写了一个代码来计算zscore,该代码计算一个文件的均值和标准差,并使用另一个文件中的行中的某些值,如下所示: 但是,当我执行此代码时,在创建临时文件的步骤中,我得到一个致命错误:尝试除以零 ,实现此代码的正确方法是什么? TIA我使用了bc -l选项,但是它给出了很长的浮动整数版本。
1回复

awk中的浮点计算

我对awk在执行浮点计算时的行为感到惊讶。 它导致我对表格数据进行错误计算。 有人可以了解这里发生了什么吗? 编辑 1 正如@fedorqui所指出的,由于重定向运算符( > ),倒数第二个命令的输出会转到名为0.1 的文件。 那么我应该如何执行大于( > ) 操作? @fedorqu
3回复

awk浮点比较不起作用

我有 x1 、 x2 和 x 值的输入文件,我想检查 x 是否是 x1 和 x2 之间的中点。 但比较失败。 示例输入文件 awk 命令 输出 由于小数点后有额外的零,比较失败。 请帮助修复它。