C++浮点数float比较equal,greater和less

//Specify the precision to compare two values
bool equal(double v1, double v2, double precision);
bool greater(double v1, double v2, double precision);
bool less(double v1, double v2, double precision);

bool equal(double v1, double v2, double precision)
{
    double unprecision = (precision < 0) ? (-1)*precision : precision;
    double dt = ((v1 < v2) ? v2 : v1) - ((v1 < v2) ? v1 : v2);
    return (dt > unprecision) ? false : true;
}

bool greater(double v1, double v2, double precision)
{
    if (equal(v1, v2, precision)) {
        return false;
    }
    else {
        return (v1 > v2) ? true : false;
    }
}

bool less(double v1, double v2, double precision)
{
    if (equal(v1, v2, precision)) {
        return false;
    }
    else {
        return (v1 < v2) ? true : false;
    }
}

//测试代码
#include <iostream>
#include <functional>
#include "../xPod_Common/common.h"

using namespace std;

void equal_print(double base, double precision, const double* dt, int size,
                 const char* true_flag, const char* false_flag, function<bool(double,double,double)> func)
{
    for (auto i=0; i<size; i++) {
        if (func(base, base+*(dt+i), precision)) {
            printf("%f %s %f, precision = %f\n", base, true_flag, base+dt[i], precision);
        }
        else {
            printf("%f %s %f, precision = %f\n", base, false_flag, base+dt[i], precision);
        }
    }
}

void equal_unit_test()
{
    //超大数据200000正负10以内
    double precision = 10;
    double baseVal = 200000;
    double dt1[] = {0.0,0.1,-0.1,0.5,-0.5,1,-1,2,-2,5,-5,10,-10,10.1,-10.1,12,-12};
    cout << "Test : 200000+10 >= x >= 200000-10" << endl;
    equal_print(baseVal, precision, &dt1[0], sizeof(dt1)/sizeof(double), "==", "!=", &xpod_common::equal);
    cout << endl << endl;

    //高精度数据1正负0.001以内
    precision = 0.001;
    baseVal = 1.0;
    double dt2[] = {0.0,0.0001,-0.0001,0.0005,-0.0005,0.001,-0.001,0.00101,-0.00101,0.0011,-0.0011,0.002,-0.002};
    cout << "Test : 1+0.001 >= x >= 1-0.001" << endl;
    equal_print(baseVal, precision, &dt2[0], sizeof(dt2)/sizeof(double), "==", "!=", &xpod_common::equal);
    cout << endl << endl;

    //大于比较
    precision = 0.1;
    baseVal = 100.0;
    double dt3[] = {-1,-0.2,-0.11,-0.10,-0.05,-0.01,0.0,0.01,0.05,0.1,0.5,1,2};
    cout << "Test : Greator" << endl;
    equal_print(baseVal, precision, &dt3[0], sizeof(dt3)/sizeof(double), ">", "<>", &xpod_common::greater);
    cout << endl << endl;

    //小于比较
    cout << "Test : Less" << endl;
    equal_print(baseVal, precision, &dt3[0], sizeof(dt3)/sizeof(double), "<", "<>", &xpod_common::less);
}

int main(int argc, char *argv[])
{
    //test equal
    equal_unit_test();

    return 0;
}

 

转载于:https://my.oschina.net/u/3489228/blog/1503496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值