用高精度实现浮点数的比较

我们知道在C/C++语言中浮点数的比较存在精度误差, 当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失。

因此我们无法用(float a==float b)进行判定,因为两个浮点类型或者是双精度类型的差值小于设定的容许差值即可认为两个数是近似相等的, 即 |x - y| < ε(x、y 为两个浮点类型或者双精度类型的数据,ε 为容许差值)。

那么这个容许差值 ε 有多大?

通常,在比较两个双精度(double)类型的数值时,ε 设置为1E-14,而在比较两个单精度(float)类型的数值时,ε 设置为 1E-7。

所以我们要精确的比较两个浮点数的大小时,可以采用字符串的处理方法来逐位实现高精度比较。

下面是我给出的C++代码实现

#include <iostream>
#include <string>
using namespace std;

void trans(string *a,string *b){
    string *temp;
    if(a->length()>b->length()){
        temp=b;
        b=a;
        a=temp;
    }//固定a长度较短b较长
}

int main() {
    string a,b;
    int n,i;
    cin>>a>>b;
    trans(&a,&b);
    int lena=(int)a.length();
    int lenb=(int)b.length();
    if(a[0]=='-'&&b[0]!='-'){
        cout<<"<";
        exit(0);
    }
    if(a[0]!='-'&&b[0]=='-'){
        cout<<">";
        exit(0);
    }
        // 先考虑一正一负的比较
    for( i=0;i<lena;++i){
        if(a[i]=='.'&&b[i]!='.'){
            cout<<"<";
            exit(0);
        }
        else{
            if(a[i]!='.'&&b[i]=='.'){
                cout<<">";
                exit(0);
            }//判断小数点出现的位置
            else{
                if(a[i]>b[i]){
                    cout<<">";
                    exit(0);
                }
                else{
                    if(a[i]<b[i]){
                        cout<<"<";
                        exit(0);
                    }//逐位比较
                    else{
                        continue;
                    }
                }
            }
        }
    }
    if(i==lena&&lena<lenb)
        cout<<"<";
    else cout<<"=";
    return 0;
}
复制代码

转载于:https://juejin.im/post/5bffda005188256693607e67

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值