浮点数比较大小的问题

浮点数比较大小,由于精度问题,所以直接比较有时可能会出错。

单精度数7位有效数字。 (float)
双精度数16位有效数字。(double)

单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位

单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为 2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)

单精度数7位有效数字。

双精度数16位有效数字。 
浮点数取值范围: 
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。 
双精度数取值范围: 
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。


所以在比较的时候需要用一个很小的数值来进行比较。(二分法的思想)当二者之差小于这个很小的数时,就认为二者是相等的了。这个很小的数,称为精度。
精度由计算过程中需求而定。比如一个常用的精度为1e-6.也就是0.000001.
所以对于两个浮点数a,b,如果要比较大小,那么常常会设置一个精度
如果fabs(a-b)<=1e-6,那么就是相等了。 fabs是求浮点数绝对值的函数。
类似的 判断大于的时候,就是if(a>b && fabs(a-b)>1e-6)。

判断小于的时候,就是if(a<b&&fabs(a-b)>1e-6)。

例如:

#include<cstdio>
#include<cmath>
const double esp = 1e-6;
int main()
{
    double a,b;
    scanf("%lf %lf",&a,&b);
    if(fabs(a - b) <= esp)
        printf("ok\n");
    else
        printf("no\n");
    return 0;
}

如有错误,还请指正,O(∩_∩)O谢谢

### Tcl 中浮点数比较方法 在 Tcl 编程语言中,浮点数比较需要注意精度问题以及数值表示方式的影响。以下是关于如何正确地在 Tcl 中比较两个浮点数大小的方法及其注意事项。 #### 1. 基本语法 Tcl 提供了多种方式进行数值比较操作,其中最常用的是 `expr` 命令来执行表达式计算并返回布尔值。对于浮点数比较,可以使用关系运算符 `<`, `>`, `<=`, `>=`, `==`, 和 `!=` 来判断两者的相对大小或相等性[^5]。 ```tcl set a 568.96 set b 568.95 if { [expr {$a > $b}] } { puts "$a is greater than $b" } elseif { [expr {$a == $b}] } { puts "$a is equal to $b" } else { puts "$a is less than or equal to $b" } ``` 上述代码展示了通过 `expr` 对变量 `$a` 和 `$b` 进行大于、等于和小于的关系测试,并打印相应的结果。 --- #### 2. 考虑浮点数精度误差 由于计算机内部存储浮点数的方式基于 IEEE 754 标准,在某些情况下可能会引入微小的舍入错误。因此直接使用 `==` 判断两个浮点数是否完全相同可能并不安全。推荐的做法是比较两者之间的差值是否在一个很小的范围内(即所谓的“容忍度”): ```tcl proc float_compare {num1 num2 tolerance} { set diff [expr {abs($num1 - $num2)}] if {[expr {$diff <= $tolerance}]} { return "Equal within the given tolerance." } elseif {[expr {$num1 > $num2}]} { return "$num1 is larger than $num2." } else { return "$num1 is smaller than $num2." } } puts [float_compare 0.1+0.2 0.3 1e-9] ``` 此函数接受三个参数:要比较的第一个浮点数 (`num1`)、第二个浮点数 (`num2`) 及允许的最大偏差 (`tolerance`)。如果它们之间差异不超过指定公差,则认为这两个数字近似相等;否则按照常规规则判定哪个更大或者更小[^6]。 --- #### 3. 注意事项 - **避免直接对比浮点数**:即使理论上应该相同的两个浮点数也可能因为四舍五入而略有不同。 - **合理设置容错范围**:取决于具体应用场景的需求设定合适的阈值。过低可能导致误判为不等,过高则掩盖实际存在的差距。 - **注意单位一致性**:确保参与运算的数据具有统一的标准测量尺度以免造成误解读取的结果。 --- ### 示例总结 综上所述,当处理涉及高精确度需求的任务时,应当采取适当措施规避潜在风险因素影响最终结论准确性。利用辅助过程定义明确界限条件下的相似程度评估机制不失为一种有效策略之一。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值