通过int 关系运算符来 比较两个 float 变量的大小

2023-11-18

#include <stdio.h>
#include <iostream>
#include <random>

using namespace std;

void compare_unnegative_float();
void show_details();

union float_int_type{
    unsigned    m_unsigned;    
    float       m_float;
    struct{
        unsigned     m_significand  : 23;
        unsigned     m_exponent  :  8;
        bool    m_sign :  1;
    };
};

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 10;
int main(){

    union float_int_type x, y;

    x.m_float = 0.0f;
    printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
    cout  << x.m_float <<":   exponent="<<x.m_exponent<<"        significand="<<x.m_significand<<endl;

    std::random_device rd;
    std::default_random_engine eng(rd());
    std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);

    compare_unnegative_float();

    //show_details();

    return 0;
}


void compare_non_negative_float(){

    union float_int_type x, y;

    x.m_float = 0.0f;
    printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
    cout  << x.m_float <<":   exponent="<<x.m_exponent<<"        significand="<<x.m_significand<<endl;

    std::random_device rd;
    std::default_random_engine eng(rd());
    std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);

    for(unsigned i=0; i<-1; i++){
        if(i%10000000==0) cout<<i<<endl;

        x.m_float = distr(eng);
        y.m_float = distr(eng);
        if(x.m_exponent>y.m_exponent || (x.m_exponent==y.m_exponent && x.m_significand>y.m_significand))
        {
            if(!(x.m_float> y.m_float)) cout<<"Error: "<<x.m_float<<" > "<<y.m_float<<" is false!"<<endl;
        }else if(x.m_exponent < y.m_exponent || (x.m_exponent == y.m_exponent && x.m_significand<y.m_significand))
        {
            if(!(x.m_float < y.m_float)) cout<<"Error: "<<x.m_float<<" < "<<y.m_float<<" is false!"<<endl;
        }else
        {
            if(!(x.m_float == y.m_float)) cout<<"Error: "<<x.m_float<<" == "<<y.m_float<<" is false!"<<endl;
        }
    }
}



void show_details(){

    union float_int_type x;
    x.m_float = 1.0f;
    printf("%x, %f, %u, %u, %u\n",x.m_unsigned, x.m_float, x.m_significand, x.m_exponent, x.m_sign);
    cout  << x.m_float <<":   exponent="<<x.m_exponent<<"        significand="<<x.m_significand<<endl;

    std::random_device rd;
    std::default_random_engine eng(rd());
    std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);

    for(int i=0; i<100; i++){
        if(i%10==0) cout<<endl;
        x.m_float = distr(eng);
        cout  << x.m_float <<":   exponent="<<x.m_exponent<<"        significand="<<x.m_significand<<endl;
    }
    cout <<endl;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过int 关系运算符来 比较两个 float 变量的大小 的相关文章

随机推荐

  • Linux之prink原理

    我的分析是基于Linux4 15 1 1 看看kernel是如何调用到console初始化函数的 分两条线 a start kernel gt console init gt call con initcall start 去调用放在 co
  • Java 集合、HashMap 底层实现原理

    一 Java 集合概述 Java 集合可分为 Collection 和 Map 两种体系 Collection接口 单列数据 定义了存取一组对象的方法的集合 List 元素有序 指的是存储时 与存放顺序保持一致 可重复的集合 Set 元素无
  • Mybatis---增删改查

    目录 一 添加用户 1 持久层接口方法 2 映射文件 3 测试方法 二 修改用户 1 持久层接口方法 2 映射文件 3 测试方法 三 删除用户 1 持久层接口方法 2 映射文件 3 测试方法 四 查询用户 1 持久层接口方法 2 映射文件
  • Redis查询当前库有多少个 key

    info可以看到所有库的key数量 dbsize则是当前库key的数量 keys 这种数据量小还可以 大的时候可以直接搞死生产环境 dbsize和keys 统计的key数可能是不一样的 如果没记错的话 keys 统计的是当前db有效的key
  • C++面试题之继承

    目录 设计一个类型 不能在外部环境中创建该类的对象 设计一个不能被继承的类 设计一个不能被继承的类 但可以在外部环境创建该类型的对象 设计一个能被继承的类 但不能在外部环境创建该类型的对象 限制派生类对象不可以拷贝和赋值如何实现 设计一个类
  • Git(五):历史提交与远程仓库修改

    目录 4 查看提交历史 4 1 查看日志详细信息 4 2 查看某次提交信息 4 3 查看更改 5 撤销操作 5 1 取消暂存的文件 5 2 撤销对文件的修改 5 3 撤销远程记录 6 远程仓库的使用 6 1 查看远程仓库 6 2 添加远程仓
  • Python自动化部署环境

    import paramiko import sys 创建SSHClient实例对象 ssh paramiko SSHClient 调用方法 表示没有存储远程机器的公钥 允许访问 ssh set missing host key polic
  • 全球及中国冷链物流产业需求前景与投资竞争力研究报告2022版

    全球及中国冷链物流产业需求前景与投资竞争力研究报告2022版 HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年11月 搜索鸿晟信合研究院查看官网更多内容 第一章 冷链物流相关概述 1 1 冷链物流
  • socket传输图片之TCP协议

    在学习socket传输图片之前 我们应该先具备一些基础知识 opencv图片编码和解码 cv2 imencode cv2 imdecode 这两个函数是本教程再传输图片会用到的 个人粗浅的理解是放在内存的中的图片是以图像数据的形式存放的 而
  • 解决gomock报错:doesn‘t match the argument at index 1.

    这个问题在stack Overflow上面有一些解答 但是由于这个报错比较泛 导致仅仅看这个报错信息很难去定位写单测的时候哪里错了 我们需要使用go test v run 函数名 或者直接在vscode上面点击run 我当时发现了有下面的报
  • 逗号分隔String字符串 - 数组 - 集合,相互转换

    1 准备一个逗号分割字符串 String str 小张 小王 小李 小赵 2 逗号分割字符串转换为集合 转换为集合之前会先转换为数组 第一种 先用split将字符串按逗号分割为数组 再用Arrays asList将数组转换为集合 List
  • 暴力破解漏洞

    漏洞概述 暴力破解攻击 又叫字典攻击 是指攻击者系统地组合了所有可能性尝试破解用户的账户名 密码等敏感信息 通常使用自动化脚本或者工具进行暴力破解工具 漏洞产生的主要原因是 1 没有强制用户设置复杂密码 比如密码由数字 字母 特殊字符构成
  • 创建一个maven项目

    先图片的步骤来 2 3 4 5 6 8 9
  • webpack配置指定输出目录和名称记录一下

    const path require path const MiniCssExtractPlugin require mini css extract plugin 表示自定义的系统配置 module exports css 是否使用css
  • 【100%通过率 】【华为OD机试c++/python】实力差距最小总和【2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 游戏里面 队伍通过匹配实力相近的对手进行对战 但是如果匹配的队伍实力相差太大 对于双方游戏体验都不会太好 给定n个队伍的实力值 对其进行两两实力
  • ini文件(QSettings)保存QNetworkCookie(或自定义结构体)——Qt

    前言 之前我用过QSettings写过ini文件作为配置文件 也用过QVariant变量 无论是官方支持的还是自定义的 但是在ini文件中 将QVariant的值作为Value进行保存 是没遇到过 也没做过 这次公司项目中涉及到将Cooki
  • Springboot读取配置文件、pom文件及自定义配置文件

    前言 很多人都知道读取配置文件 这是初级做法 上升一点难度是使用java bean的方式读取自定义配置文件 但是大家很少有知道读取pom文件信息 接下来我都会讲到 正文 笔者还是基于Spring Boot v1 5 8 RELEASE 利用
  • discuz首页出现重定向过多,discuz首页域名和默认域名一致的情况下无法保存

    问题 discuz首页域名和默认域名一致的情况下无法保存 如不填首页域名出现重定向过多问题 解决思路 使用FTP打开 source admincp admincp domain php将下面一段注释起来即可 约在63 65行 if empt
  • Advanced REST client的使用说明以及安装

    1 为什么要使用REST Client 在实际企业开发过程中经常会有这样的需求 1 我当前开发的这个系统是需要调用其他系统的接口 也就是我们需要频繁的测试接口 尝试不同的入参参数去查看返回结果 如果要在程序中调试就必要不断的改代码 重启to
  • 通过int 关系运算符来 比较两个 float 变量的大小

    include