Linux bc命令(bc指令)(基本计算器)(任意精度计算语言:支持浮点数运算、变量赋值和自定义函数等)

文章目录

  • bc命令文档
    • 英文
    • 中文
  • Linux `bc` 命令详解
    • `bc` 命令的基本用法
      • 启动 `bc` 环境
      • 进行基本计算
      • 退出 `bc`
    • `bc` 中的数学功能
      • 执行高级数学计算
        • 平方根和指数函数
        • 对数函数
      • 处理精度问题
    • 变量和数组
      • 变量赋值和使用
      • 数组的使用
    • 创建和使用自定义函数
  • `bc` 命令的高级用法
    • 在脚本中使用 `bc`
      • 基本脚本集成
      • 使用循环和条件语句
    • `bc` 中的高级数学和逻辑运算
      • 使用逻辑运算符
      • 三元运算符的使用(不支持原生语法,但是可模拟)
    • 自定义函数的进阶应用
      • 复杂函数定义
      • 函数的重用
    • 结语

bc命令文档

英文

root@ky:~# bc --help
usage: bc [options] [file ...]
  -h  --help         print this usage and exit
  -i  --interactive  force interactive mode
  -l  --mathlib      use the predefined math routines
  -q  --quiet        don't print initial banner
  -s  --standard     non-standard bc constructs are errors
  -w  --warn         warn about non-standard bc constructs
  -v  --version      print version information and exit

中文

root@ky:~# bc --help
usage: bc [options] [file ...]
  -h  --help         打印此使用信息并退出
  -i  --interactive  强制进入交互模式
  -l  --mathlib      使用预定义的数学例程
  -q  --quiet        不显示初始标语
  -s  --standard     非标准 bc 构造是错误的
  -w  --warn         警告非标准 bc 构造
  -v  --version      打印版本信息并退出

Linux bc 命令详解

bc(基本计算器)是一种在Unix和类Unix操作系统中广泛使用的任意精度计算语言。它的功能强大,支持浮点数运算、变量赋值和自定义函数等。本文将深入探讨 bc 命令的用法和特性,并提供实用的示例。

bc 命令的基本用法

启动 bc 环境

bc 可以在命令行中直接启动。默认情况下,它不会输出计算过程中的每一步结果,直到收到一个表达式并求值后才显示结果。启动 bc 的最简单方式是在命令行中输入 bc,然后按 Enter 键:

$ bc

在这里插入图片描述

进行基本计算

bc 环境中,可以执行基本的数学运算,如加、减、乘、除等。例如:

1 + 1
2 * 3
4 / 2
5 - 3

在这里插入图片描述

退出 bc

要退出 bc,可以使用 quit 命令或者组合键 Ctrl+D

quit

在这里插入图片描述

bc 中的数学功能

执行高级数学计算

bc 支持多种数学函数,包括但不限于平方根、指数、对数等。为了使用这些功能,需要在启动 bc 时加入 -l 选项,这将载入数学库。

$ bc -l

在这里插入图片描述

平方根和指数函数

计算数字的平方根可以使用 sqrt() 函数,计算指数可以使用 ^ 运算符:

sqrt(9)
2^3

在这里插入图片描述

对数函数

计算自然对数和常用对数:

l(2)    # 自然对数
l(100)/l(10)  # 常用对数,即 log10(100)

在这里插入图片描述

处理精度问题

bc 默认的小数精度较低(看着也不低啊?):

在这里插入图片描述

可以通过设置 scale 变量来调整精度。例如,计算圆周率π的值(保留十位小数):

scale=10
4*a(1)

a(x) 是反正切函数,利用数学公式

在这里插入图片描述
在这里插入图片描述

来计算。

变量和数组

变量赋值和使用

bc 中,变量可以存储计算结果,便于后续操作。赋值操作使用 = 运算符:

x = 5
y = 3 * x + 2

在这里插入图片描述

数组的使用

bc 也支持一维数组,用于存储一系列值:

arr[0] = 5
arr[1] = arr[0] * 2

在这里插入图片描述

创建和使用自定义函数

bc 允许用户定义函数,这为复杂计算提供了便利。定义函数的语法如下:

define f(x) {
    return (x * x + 2);
}

调用自定义函数:

f(4)

在这里插入图片描述

这部分讨论了 bc 的基本使用方法、数学功能、变量与数组的操作,以及如何创建和使用自定义函数。在下一部分中,将继续探讨如何在脚本中使用 bc 来进行批量计算和其他高级功能。

bc 命令的高级用法

在脚本中使用 bc

bc 可以被嵌入到 shell 脚本中,以执行复杂的计算任务。这是自动化计算任务的一个有效方法。

基本脚本集成

可以通过将表达式传递给 bc 来从 bash 脚本中调用 bc。例如,下面的脚本用于计算两个变量的乘积:

#!/bin/bash
a=5
b=6
result=$(echo "$a * $b" | bc)
echo "The result is $result"

在这里插入图片描述

使用循环和条件语句

bc 也支持循环和条件语句,这可以在更复杂的脚本中使用。例如,一个计算阶乘的 bc 脚本:

#!/bin/bash
n=5
factorial=1

for ((i = 1; i <= n; i++)); do
    factorial=$(echo "$factorial * $i" | bc)
    echo "The temp factorial is $factorial"
done

echo "The factorial of $n is $factorial"

在这里插入图片描述

bc 中的高级数学和逻辑运算

使用逻辑运算符

bc 支持逻辑运算符,这使得在执行数学计算时可以包括条件测试。逻辑运算符包括 <><=>===!=

#!/bin/bash
x=5
# x=15
y=10
check=$(echo "$x < $y" | bc)
echo "check is $check"
if [ "$check" -eq 1 ]; then
    echo "$x is less than $y"
else
    echo "$x is not less than $y"
fi

在这里插入图片描述

三元运算符的使用(不支持原生语法,但是可模拟)

bc支持 C 风格的三元运算符 ?:,可以在单行内进行条件判断和赋值:

result=$(echo "a = 5; b = 3; a > b ? a : b" | bc)
echo "The larger number is $result"

报错了:

在这里插入图片描述

可改成:

#!/bin/bash

result=$(echo "a = 5; b = 3; if (a > b) a else b" | bc)
echo "The larger number is $result"

在这里插入图片描述

解释:

bc 中使用三元运算符时确实需要特别的格式,由于 bc 对于标准的三元运算符支持不同于一些其他编程环境。要在 bc 中正确使用三元运算符,必须确保 bc 在处理表达式时已经启用了扩展语法。这通常可以通过使用 -l 选项来启动 bc 来确保启用。

修改后的脚本如下:

#!/bin/bash

result=$(echo "a = 5; b = 3; if (a > b) a else b" | bc) echo "The
larger number is $result" 

在这个修改后的版本中,我使用了 if-else 语句替代了三元运算符,因为 bc 的标准版本中没有内建支持类似于 C 语言风格的三元运算符。使用 if-else 语句是在 bc 中进行条件判断的一种有效方式。

自定义函数的进阶应用

复杂函数定义

bc 中可以定义更复杂的函数,例如实现递归计算。以下是一个计算斐波那契数列的函数:

define fib(n) {
    if (n <= 2) return 1;
    return (fib(n-1) + fib(n-2));
}

在这里插入图片描述

函数的重用

定义好的函数可以在多个计算中重复使用,提高代码的复用性和清晰度。例如,定义一个计算组合数的函数,然后用于求解不同的组合问题:

define comb(n, k) {
    if (k == 0 || k == n) return 1;
    return (comb(n-1, k-1) + comb(n-1, k));
}

定义的 comb(n, k) 函数计算的是从 n 个元素中选择 k 个元素的组合数,也被称为二项式系数。在数学上,这个值通常表示为 “C(n, k)” 或
在这里插入图片描述
,并且可以用以下的数学公式计算:

在这里插入图片描述

这个函数使用了递归的方法来计算组合数。递归的基本案例是当 k == 0k == n 时,组合数是 1,因为从 n 个元素中选择 0 个或所有 n 个元素的方式只有一种。对于其他情况,组合数是从前 n-1 个元素中选择 k-1 个元素的组合数加上从前 n-1 个元素中选择 k 个元素的组合数。这是基于组合数的递归性质:每个元素都有两种可能,要么被选中,要么不被选中。

如果想在 bc 中使用这个函数来计算具体的组合数,可以按照之前提供的方法将函数定义和调用放入 Bash 脚本,并通过 bc 执行。这里是一个如何使用这个函数的示例:

#!/bin/bash

# 定义和调用组合数函数
calculate_comb() {
    bc <<EOF
define comb(n, k) {
    if (k == 0 || k == n) return 1;
    return comb(n-1, k-1) + comb(n-1, k);
}
comb($1, $2)
EOF
}

# 调用函数计算组合数 C(5, 2)
result=$(calculate_comb 5 2)
echo "C(5, 2) is $result"

在这里插入图片描述·

这个脚本将计算从 5 个元素中选择 2 个元素的组合数,并输出结果。

关于here document重定向,可参考文章:Shell脚本 <<EOF … EOF语法(Here Document)(特殊的输入重定向方式)(定界符)

结语

通过深入探讨 bc 命令的基础与高级用法,可以看出其在处理数学和逻辑运算中的强大能力。无论是在交互式环境中快速计算,还是作为脚本的一部分自动化复杂计算任务,bc 都是一个非常有用的工具。通过本文的介绍,希望能帮助读者更好地理解和运用这个功能强大的命令行计算器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/634870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

注解大全更新中~

Slf4j 是什么&#xff1a;Slf4j 是 Lombok 提供的一种注解&#xff0c;用于在类中自动生成一个名为 log 的日志对象。通过使用 Slf4j 注解&#xff0c;可以方便地在代码中使用日志功能&#xff0c;而无需手动创建和初始化日志对象。 怎么用&#xff1a; 1.导入依赖的包lombok…

uniapp移动端骨架屏流程

1.使用微信开发者工具来生成骨架屏&#xff1b;在分窗模式下选择页面信息&#xff0c;下拉选择生成骨架屏&#xff1b;他会基于当前页面生成骨架屏的样式 点击确定&#xff1b; 会自动生成这两个文件&#xff1b;一个是html结构文件&#xff0c;一个是css样式文件。 然后把这两…

R语言使用 ggscidca包优雅的绘制支持向量机决策曲线

DCA(Decision Curve Analysis)临床决策曲线是一种用于评价诊断模型诊断准确性的方法&#xff0c;在2006年由AndrewVickers博士创建&#xff0c;我们通常判断一个疾病喜欢使用ROC曲线的AUC值来判定模型的准确性&#xff0c;但ROC曲线通常是通过特异度和敏感度来评价&#xff0c;…

一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)

目录 ​编辑 引言 一、RDMA的基本原理 二、RDMA的主要特点 三、RDMA的编程接口 四、RDMA的代码演示 服务器端代码&#xff1a; 客户端代码&#xff1a; 五、总结 引言 RDMA&#xff0c;全称Remote Direct Memory Access&#xff0c;即远程直接内存访问&#xff0c;是…

Kafka-ACK机制(ack应答原理、冥等性、事务)

Kafka-ACK机制 Kafka中的ACK&#xff08;Acknowledgement&#xff09;机制是用于保证消息可靠传递的关键组件之一。在生产者发送消息到Kafka集群时&#xff0c;ACK机制决定了何时认为消息已经成功发送。这个机制非常重要&#xff0c;因为它影响了生产者对消息发送的信心以及消费…

fork 与 vfork 的区别

关键区别一&#xff1a; vfork 直接使用父进程存储空间&#xff0c;不拷贝。 关键区别二&#xff1a; vfork保证子进程先运行,当子进程调用exit退出后&#xff0c;父进程才执行。 我们可以定义一个cnt&#xff0c;在子进程中让它变成3&#xff0c; 如果使用fork&#xff0c;那…

uniapp中使用 iconfont字体

下载 iconfont 字体文件 打开 iconfont.css 文件&#xff0c;修改一下 把文件 复制到 static/iconfont/… 目录下 在App.vue中引入iconfont 5. 使用iconfont 使用 iconfont 有两种方式&#xff0c; 一种是 class 方式&#xff0c; 一种是使用 unicode 的方式 5.1 使用 class 的…

firewalld

一、Firewalld概述 Firewalld 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具 支持IPV4、IPV6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置 永久配置 二、Firewalld和iptables的关系 netfilter 位于L…

4. Java多线程面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 为什么要使用并发编程 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到提升方便进行业务拆分&#xff0c;提升系统并发能力和性能&#xff1a;在特殊的业务场景下&#…

微服务架构-数据共享设计模式

微服务架构-数据共享设计模式 每个微服务拥有自己的数据库&#xff0c;可以独立地进行数据库架构设计、部署和维护。这种是属于常规的方式&#xff0c;不受其他微服务的影响&#xff0c;具有高度的自治性。 然而&#xff0c;在将单体应用拆分成微服务时&#xff0c;可能会遇到…

Stable Diffusion简单食用方法

1.下载 1.1打开B站 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili哔哩哔哩&#xff08;bilibili.com)是国内知名的视频弹幕网站&#xff0c;这里有及时的动漫新番&#xff0c;活跃的ACG氛围&#xff0c;有创意的Up主。大家可以在这里找到许多欢乐。https://www.bilibili.com/ 1.2搜索…

纯血鸿蒙APP实战开发——边缓存边播放案例

介绍 OhosVideoCache是一个支持边播放边缓存的库&#xff0c;只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器&#xff0c; OhosVideoCache就可以一边下载音视频数据并保存在本地&#xff0c;一边读取本地缓存返回给播放器&#xff0c;使用者无需进行其他操作…

低耦合双写一致性方案-使用canal+MQ

需求&#xff1a;继上一篇使用xxljob实现数据的全量同步到es后&#xff0c;当数据库中新增、删除、修改数据时&#xff0c;应该对es中的对应索引库实现增量同步。 本文介绍了2种双写一致性方案&#xff0c;对其中使用MQ的方案进行了实现。 1. 方案设计 1.1 数据一致性问题分析…

vue 点击复制文本到剪贴板

一、首先在vue文件的template中定义复制按钮 <div size"small" v-if"item.prop jadeCode" class"cell-container"><span>{{ scope.row.jadeCode }}</span> <button click"handleCopy(scope.row.jadeCode)" clas…

js——数据操作——实现阶梯价格排序——基础积累

最近在写网络报价的时候&#xff0c;遇到一个需求&#xff0c;就是要根据采购数量&#xff0c;找到符合数量的阶梯区间&#xff0c;并找到最便宜的采购价格。 比如下面&#xff1a; let originViewList [{id:1,incrementalQuantity:10,priceList:[{minQuantity:1,price:20},…

el-upload上传图片,视频可获取视频时长。

对element-ui组件的upload组件再一次封装&#xff0c;简单记录。下面是效果图。 注意点&#xff1a;该组件现在仅支持单图和单个视频上传。 <template><div :style"myStyle"><divclass"uploads":style"{width: upWith px,height: up…

零门槛微调大模型:基于 Ludwig 低代码框架使用 LoRA 技术微调实践

一、Ludwig 介绍 自然语言处理 (NLP) 和人工智能 (AI) 的飞速发展催生了许多强大的模型&#xff0c;它们能够理解和生成如同人类般的文本&#xff0c;为聊天机器人、文档摘要等应用领域带来了革命性的改变。然而&#xff0c;释放这些模型的全部潜力需要针对特定用例进行微调。…

我用通义千问做了个银从初级法规考试答题AI助手

我用通义千问做了个银从初级法规考试答题AI助手 起因方法&#xff1a;创建方法&#xff1a;微调成果展示 起因 多选考试实在太难了&#xff0c;惨不忍睹的正确率&#xff0c;博主我就想有一个专门刷多选的工具&#xff0c;但找了半天没找到。然后就想到用通义试试&#xff0c;…

MySQL 服务无法启动

常见原因: 检查端口占用&#xff1a; 使用命令行工具&#xff08;如netstat&#xff09;来检查3306端口是否已被其他程序占用,输入netstat -ano&#xff08;Windows&#xff09;或netstat -tulnp | grep 3306&#xff08;Linux/Mac&#xff09;来查找3306端口的占用情况。如果…

excel转pdf并且加水印,利用ByteArrayOutputStream内存流不产生中间文件

首先先引入包&#xff1a;加水印和excel转PDF的 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>org.apache.poi&l…