我想用 bash 中的两个有效数字打印浮点数(可能使用常用工具,如 awk、bc、dc、perl 等)。
例子:
在这两种情况下,有效数字都是 7 和 6。我已经阅读了一些类似问题的答案,例如:
但答案的重点是限制小数位数(例如bc
command withscale=2
或printf
command with %.2f
)而不是有效数字。
有没有一种简单的方法可以用正好 2 个有效数字来格式化数字,还是我必须编写自己的函数?
我想dc
用十六进制点处理一些基数为 16 的数字,但我遇到了精度问题。例如,下面,我乘F423F.FD
用100
,无论是十六进制。预期的答案是F423FFD
,而不是给出F423FFA.E1
,接近但即使在四舍五入后也不够准确。
$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1
Run Code Online (Sandbox Code Playgroud)
我读到这dc
是一个无限精度的计算器,无论如何这都不是一个很大的数字。有什么我做错了吗?
感谢您的回答。考虑到 的问题dc
,我硬着头皮写了自己的解析器来解析其他基数的实数。如果有人对代码感兴趣,我可以在这里发布。
$ echo "$?"
0
$ echo 'q' | dc || echo "$?"
1
Run Code Online (Sandbox Code Playgroud)
为什么使用q
退出dc
被认为是错误?
(测试在Ubuntu 20.4上运行。)
我无法理解手册页中给出的这个例子dc
:
$ dc
1 0:a 0Sa 2 0:a La 0;ap
1
Run Code Online (Sandbox Code Playgroud)
对我来说答案应该是 2 因为:
1 0:a
这里我们将 1 存储在 array 的第 0 个位置a
。
0Sa
现在我们将 0 压入 register 的堆栈a
。
2 0:a
现在我们再次将 2 存储在数组的第 0 个位置,a
从而覆盖先前存储在该位置的 1。
La
现在我们弹出存储在寄存器堆栈中的 0a
并将其推送到主堆栈。
0;a
现在我们再次将 0 推送到主堆栈,然后将其弹出以用作数组索引,因此我们将存储在数组第 0 个位置的 2 推a
送到主堆栈。
p
现在我们打印主堆栈的顶部,即 2。所以答案应该是 2。
我错过了什么?
PS- 我想dc
用作标签,但看起来它不存在,因此必须至少使用一个标签debian
(我的工作站操作系统)。
dc
可以从文件或/和标准输入中读取命令。
如果我想打印用户输入:
cat essai_dc
[enter a number : ]
n
?
p
dc essai_dc
enter a number : 4
4
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试使用heredoc
:
dc <<EOF
> [enter a number : ]
> n
> ?
> p
> EOF
enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)
我对标准输入也一样:
cat essai_dc | dc
enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)
命令 ?获取p
并执行它,但堆栈为空。
是否有可能让它工作(告诉dc
等待输入)
运行该dc
实用程序时,如果我输入了一个非常大的数字,请说:
99999999999999999999999999999999999999999999999999999999999999
当我使用 打印出来时p
,我得到:
999999999999999999999999999999999999999999999999999999999999999999999\
999
Run Code Online (Sandbox Code Playgroud)
为什么它在 69 位后拆分输出?