浮点数的二分写法以及判断大小

本文介绍了三种关于浮点数处理的实用技巧:1. 如何使用二分法解决浮点数问题;2. 如何直接判断浮点数的大小或范围;3. 在指定精度下判断两个浮点数是否相等的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1.浮点数二分:

{
    const double EPS = 1e-8;
    double l = 0.0, r = 1.0e8;
    while(l+EPS<=r)
    {
        double mid = (l+r)/2;
        if(test())
            l = mid + EPS;  // r = mid - EPS;
        else
            r = mid - EPS;  // l = mid + EPS;
    }
    double ans = r;         // double ans = l;
}


2.浮点数判断大小或范围:

直接像int类型那样判断。



3.在限定的精度内,判断两个浮点数是否相等:

abs(a-b)<精度

<think>我们正在回答用户关于Shell脚本中常用判断符及其用法的问题。根据用户引用的内容,特别是引用[3]和引用[4],我们知道用户关心的是条件测试中的判断符。在Shell脚本中,条件测试主要使用test命令或者[](方括号)来执行。判断用于比较字符串、整数,检查文件属性等。下面我们将分类介绍常用的判断符及其用法:###一、字符串比较-`=`或`==`:检查两个字符串是否相等。注意在`[]`中,`=`和`==`是等价的,但在`[[]]`中,`==`支持模式匹配(通配符)。-`!=`:检查两个字符串是否不相等。-`-z`:检查字符串长度是否为零(空字符串)。-`-n`:检查字符串长度是否非零(非空字符串)。示例:```bashstr1="hello"str2="world"if["$str1"="$str2"];thenecho"Stringsareequal"elseecho"Stringsarenotequal"fiif[-n"$str1"];thenecho"str1isnotempty"fi```###二、整数比较-`-eq`:等于(equal)-`-ne`:不等于(notequal)-`-gt`:大于(greaterthan)-`-ge`:大于等于(greaterthanorequal)-`-lt`:小于(lessthan)-`-le`:小于等于(lessthanorequal)示例:```bashnum1=10num2=20if[$num1-lt$num2];thenecho"num1islessthannum2"fi```###三、文件测试-`-e`:文件是否存在(existence)-`-f`:是否为普通文件(file)-`-d`:是否为目录(directory)-`-s`:文件存在且大小大于零(size)-`-r`:文件可读(readable)-`-w`:文件可写(writable)-`-x`:文件可执行(executable)-`-L`:文件是否为符号链接(link)示例:```bashfile_path="/path/to/file"if[-f"$file_path"];thenecho"$file_pathisaregularfile"fiif[-x"$file_path"];thenecho"$file_pathisexecutable"fi```###四、逻辑运算符-`!`:逻辑非-`-a`:逻辑与(在`[]`中使用,但推荐使用`&&`在`[[]]`中)-`-o`:逻辑或(在`[]`中使用,但推荐使用`||`在`[[]]`中)在`[[]]`中可以使用`&&`和`||`进行逻辑组合,而且不需要对变量加双引号(因为不会发生单词分割),并且支持通配符匹配。示例:```bashfile="example.txt"if[-f"$file"-a-r"$file"];thenecho"$fileisaregularfileandreadable"fi#使用[[]]更安全且功能更强if[[-f"$file"&&-r"$file"]];thenecho"$fileisaregularfileandreadable"fi#使用正则表达式匹配(在[[]]中)if[["$str"=~^[0-9]+$]];thenecho"$strconsistsofdigitsonly"fi```###五、使用双中括号`[[]]`的优势1.支持模式匹配(使用`==`时,右侧可以包含通配符)2.支持正则表达式匹配(使用`=~`)3.逻辑运算符`&&`和`||`更直观4.字符串比较时不需要引号(不会进行单词分割和路径扩展)示例(模式匹配):```bashfilename="example.txt"if[["$filename"==*.txt]];thenecho"Textfile"fi```###六、注意事项1.在`[]`中使用变量时,变量要用双引号括起来,以防止变量为空或包含空格时出现语法错误。2.使用`[[]]`可以避免很多引号问题,但注意`[[]]`是bash的扩展特性,不是所有shell都支持(如sh),因此脚本首行应指`#!/bin/bash`。3.对于算术比较,也可以使用`(())`,例如:`if((num1<num2));then...`,这样更符合编程习惯。###七、实例演示根据引用[2]中的例子,使用正则表达式判断用户输入:```bashread-p"Areyourich?yesorno:"ANSWERif[[$ANSWER=~^[Yy]([Ee][Ss])?$]];thenecho"Youarerich"elseecho"GoodGoodStudy,DayDayUp!"fi```###八、总结Shell脚本中的判断符是条件测试的基础,熟练掌握这些判断符对于编写健壮的脚本至关重要。在实际使用中,推荐使用双中括号`[[]]`,它提供了更强大的功能和更简洁的语法。---§§相关问题§§1.在Shell脚本中如何正确比较浮点数?2.如何判断一个字符串是否包含另一个子字符串?3.Shell脚本中`[]`和`[[]]`的主要区别是什么?</think>### Shell脚本常用判断符详解 #### 一、基本判断类型 1. **文件测试判断符** - `-e`:文件是否存在 ```bash if [ -e "/path/file.txt" ]; then echo "文件存在" fi ``` - `-f`:是否为普通文件 - `-d`:是否为目录 - `-r`/`-w`/`-x`:文件是否可读/可写/可执行 - `-s`:文件大小是否大于0字节 ```bash [ -s "log.txt" ] && echo "文件非空" # 单行判断写法[^1] ``` 2. **字符串判断符** - `=` 或 `==`:字符串相等(`==`仅在`[[ ]]`中有效) ```bash if [ "$str1" = "$str2" ]; then ... ``` - `!=`:字符串不相等 - `-z`:字符串长度为零(空字符串) - `-n`:字符串长度非零 ```bash [ -n "$username" ] || echo "用户名为空" # 逻辑或写法 ``` 3. **数值比较判断符** | 符号 | 含义 | 示例 | |------|--------------|--------------------------| | `-eq` | 等于 | `[ $a -eq $b ]` | | `-ne` | 不等于 | `[ $a -ne 0 ]` | | `-gt` | 大于 | `[ $count -gt 10 ]` | | `-ge` | 大于等于 | `[ $age -ge 18 ]` | | `-lt` | 小于 | `[ $temp -lt 100 ]` | | `-le` | 小于等于 | `[ $score -le 60 ]` | #### 二、高级判断技巧 1. **正则匹配(需双中括号)** ```bash if [[ $answer =~ ^[Yy](es)?$ ]]; then echo "用户选择Yes" fi ``` 引用[2]中的正则示例:`[[ $ANSWER =~ ^[Yy]|[Yy][Ee][Ss]$ ]]` 2. **组合条件判断** - `-a`:逻辑与(在单中括号中使用) ```bash [ -f file.txt -a -r file.txt ] # 文件存在且可读 ``` - `-o`:逻辑或 ```bash [ $age -lt 18 -o $age -gt 65 ] # 年龄<18或>65 ``` - `!`:逻辑非 ```bash [ ! -d "/tmp" ] && mkdir /tmp # 目录不存在则创建 ``` #### 三、判断结构对比 | 类型 | 语法 | 特点 | |------------|-----------------------|----------------------------------| | `test`命令 | `test -e file` | 兼容性最好 | | 单中括号 | `[ -e file ]` | 等同于test,需严格空格 | | 双中括号 | `[[ $var == pattern ]]` | 支持通配符/正则,无需变量引号[^4] | #### 四、安全实践要点 1. **变量防护** 始终用双引号包裹变量,避免空值或空格导致的语法错误: ```bash # 错误写法:[ $var = "value" ] # 正确写法:[ "$var" = "value" ] ``` 2. **数值比较替代方案** 使用`(( ))`进行算术比较更直观: ```bash if (( count > MAX_ATTEMPTS )); then echo "超过尝试次数" fi ``` 3. **多条件判断优化** 优先使用`&&`/`||`替代`-a`/`-o`: ```bash [[ -f config.ini && -r config.ini ]] # 比[ -a ]更安全 ``` #### 五、完整示例 ```bash #!/bin/bash # 检查系统状态[^3] if [ $(who | wc -l) -gt 5 ]; then echo "警告:当前登录用户过多" >&2 elif [[ $(df -h / | awk 'NR==2 {print $5}') =~ 9[0-9]% ]]; then echo "磁盘空间即将用尽" elif [ ! -f "/var/lock/process.lock" -a -x "/usr/bin/startup.sh" ]; then /usr/bin/startup.sh fi ``` > **注意**: > 1. 在`[ ]`中每个元素必须用空格分隔:`[ "$a" = "$b" ]` > 2. 使用`[[ ]]`时模式匹配不需要引号:`[[ $file == *.log ]]` > 3. 数学比较推荐使用`(( ))`:`(( counter++ ))`[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值