标签: dc

如何在bash中使用恰好2位有效数字格式化浮点数?

我想用 bash 中的两个有效数字打印浮点数(可能使用常用工具,如 awk、bc、dc、perl 等)。

例子:

  • 76543 应该打印为 76000
  • 0.0076543 应打印为 0.0076

在这两种情况下,有效数字都是 7 和 6。我已经阅读了一些类似问题的答案,例如:

如何在shell中舍入浮点数?

Bash 限制浮点变量的精度

但答案的重点是限制小数位数(例如bccommand withscale=2printfcommand with %.2f)而不是有效数字。

有没有一种简单的方法可以用正好 2 个有效数字来格式化数字,还是我必须编写自己的函数?

bash awk bc floating-point dc

20
推荐指数
1
解决办法
4万
查看次数

失去直流精度

我想dc用十六进制点处理一些基数为 16 的数字,但我遇到了精度问题。例如,下面,我乘F423F.FD100,无论是十六进制。预期的答案是F423FFD,而不是给出F423FFA.E1,接近但即使在四舍五入后也不够准确。

$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1
Run Code Online (Sandbox Code Playgroud)

我读到这dc是一个无限精度的计算器,无论如何这都不是一个很大的数字。有什么我做错了吗?

感谢您的回答。考虑到 的问题dc,我硬着头皮写了自己的解析器来解析其他基数的实数。如果有人对代码感兴趣,我可以在这里发布。

dc

13
推荐指数
2
解决办法
1161
查看次数

为什么使用 q(uit) 时“dc”命令退出(1)?

$ echo "$?"
0
$ echo 'q' | dc || echo "$?"
1
Run Code Online (Sandbox Code Playgroud)

为什么使用q退出dc被认为是错误?

(测试在Ubuntu 20.4上运行。)

dc exit-status

11
推荐指数
1
解决办法
962
查看次数

dc unix:即使在同一数组索引处存储新值后仍保留初始值

我无法理解手册页中给出的这个例子dc

$ dc  
 1 0:a 0Sa 2 0:a La 0;ap  
 1  
Run Code Online (Sandbox Code Playgroud)

对我来说答案应该是 2 因为:

  1. 1 0:a
    这里我们将 1 存储在 array 的第 0 个位置a

  2. 0Sa
    现在我们将 0 压入 register 的堆栈a

  3. 2 0:a 现在我们再次将 2 存储在数组的第 0 个位置,a从而覆盖先前存储在该位置的 1。

  4. La
    现在我们弹出存储在寄存器堆栈中的 0a并将其推送到主堆栈。

  5. 0;a
    现在我们再次将 0 推送到主堆栈,然后将其弹出以用作数组索引,因此我们将存储在数组第 0 个位置的 2 推a送到主堆栈。

  6. p
    现在我们打印主堆栈的顶部,即 2。所以答案应该是 2。

我错过了什么?

PS- 我想dc用作标签,但看起来它不存在,因此必须至少使用一个标签debian(我的工作站操作系统)。

calculator dc

5
推荐指数
2
解决办法
1262
查看次数

dc 和标准输入或带字符串命令的heredoc?

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等待输入)

shell here-document dc

4
推荐指数
1
解决办法
73
查看次数

dc 打印如何拆分长号

运行该dc实用程序时,如果我输入了一个非常大的数字,请说:

99999999999999999999999999999999999999999999999999999999999999

当我使用 打印出来时p,我得到:

999999999999999999999999999999999999999999999999999999999999999999999\
999
Run Code Online (Sandbox Code Playgroud)

为什么它在 69 位后拆分输出?

dc

2
推荐指数
2
解决办法
270
查看次数

标签 统计

dc ×6

awk ×1

bash ×1

bc ×1

calculator ×1

exit-status ×1

floating-point ×1

here-document ×1

shell ×1