文档章节

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

极客行
 极客行
发布于 2017/08/06 12:41
字数 353
阅读 91
收藏 0
//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;
}

 

© 著作权归作者所有

极客行
粉丝 0
博文 221
码字总数 73818
作品 0
深圳
技术主管
私信 提问
函数调用约定 (cdecl stdcall)

函数调用约定 (cdecl stdcall) 在 C 语言里,我们通过阅读函数声明,就知道怎么携带参数去调用函数,也能在函数体定义内使用这些参数。但是 CPU 并不直接完成函数调用的传参操作,这需要人为...

傅易
2018/08/18
61
0
LeetCode 406. Queue Reconstruction by Height (依据高度进行队列重构)

原题 Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers , where is the height of the person and is the number of people......

dby_freedom
2018/12/18
0
0
Priority_Queue(优先队列)

我们都知道,队列是一种FIFO的数据结构,规定在队尾增加元素,在队首删除元素,和食堂排队打饭一个道理。(当然,插队的人是很鄙视的)。而在优先队列中,每个元素却有了特权,被赋予了优先级...

回忆酿的甜
01/22
0
0
CalcStar —— 一个 C++ 的数学表达式计算器

下载源码 - 969.2 KB 下载发行版 - 4.4 MB 介绍 CalcStar是一个可扩展的、快速的C++函数计算器,它有着像科学计算器一样强大的计算能力。它的库可以在任何C++工程中使用,提供函数计算功能。...

oschina
2014/03/25
1K
2
函数类: unary_function Struct

unaryfunction有一个兄弟是binaryfunction,俩格的区别是一个为了使用一个参数输入的函数对象,另一个适合两个输入参数的函数对象。对于STL不熟悉的人,很难理解为什么好端端的函数对象, 为...

woodo
2014/04/10
87
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部