使用 C++ bitset 操纵浮点数类型(float、double)
#include <bitset>
bitset 类是将数据转换为二进制位(遵循 IEEE 754 的存储和表示方法,关于 IEEE 754 更多更全的使用方法和原理请见 IEEE 754——计算机中浮点数的表示方法 )。
如下:
#include <bitset>
#include <limits>std::cout << std::bitset<std::numeric_limits<unsigned long>::digits>(267) << std::endl;// std::numeric_limits<unsigned long>::digits == 16// 输出为:0000000100001011
std::cout << std::bitset<std::numeric_limits<unsigned long>::digits(267) << std::endl;// std::numeric_limits<unsigned long>::digits == 32// 输出为:00000000000000000000000100001011
在 Python 中我们可轻易地将字符串形式的二进制数据转换为十进制类型:
# Python
>>> int('1000101011', 2)
555
在 C++ 中我们通过 bitset 进行类型的转化:
// C++
std::cout << std::bitset<32>("1000101011").to_ullong() << std::endl;// 555// 其中 to_ullong() 成员函数的返回类型为 _ULonglong// typedef unsigned long long _ULonglong;
在 IEEE 754——计算机中浮点数的表示方法 一文中我们知道十进制的小数 125.125表示为二进制的形式(IEEE 754)为:01000010111110100100000000000000。
当我们试图使用 bitset 做十进制向二进制位的转换时:
std::cout << std::bitset<32>(125.125) << std::endl;// 00000000000000000000000001111101// 不仅和预期结果不同,// 而且编译器会提示如下的警告// warning C4244: “参数”: 从“double”转换到“_ULonglong”,可能丢失数据
进一步查看类型定义可知:
typedef unsigned long long _ULonglong;
我们索性进行一次强制类型转换:
std::cout << std::bitset<32>(_ULonglong(125.125)) << std::endl;// 输出为:// 00000000000000000000000001111101// 仍与预期不同
进一步我们知 125.125 是有符号的,也即其二进制位 01000010111110100100000000000000 的首位为0,而_ULonglong 不仅无符号还将双精度类型强转为了整数类型。
最终我们做如下的处理:
float n = 125.125;
std::cout << std::bitset<32>(*(_ULonglong* )&n) << std::endl;// 01000010111110100100000000000000// 此为 32 位单精度类型
// 进一步我们可将之转换为 64 位双精度类型
double m = 125.125;
std::cout << std::bitset<64>(*(_ULonglong* )&m) << std::endl;// 0100000001011111010010000000000000000000000000000000000000000000
使用 C++ bitset 操纵浮点数类型(float、double)相关推荐
- Java中的简单浮点数类型float和double不能够进行精确运算
在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { doub ...
- 浮点类型float double 以及BigDecimal
1.引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果, ...
- C语言的int, float,double相互转化 (从本质上理解可能的问题)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/github_33873969/article/details/78040129 从学了C语言之后,一 ...
- C语言:十六进制(HEX)和浮点类型(float、double)转换
目录 1.浮点类型转换为十六进制 方法1:用地址用指针 方法2:用共用体 方法3: 使用memcpy 2.十六进制转换为浮点类型 近日在研究Modbus协议的时候遇到这样一个情况:使用ModScan3 ...
- 转载——C语言中float,double类型,在内存中的结构(存储方式)
最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...
- android float类型保留两位小数_你知道MySQL中Decimal类型和Float Double的区别吗?
出处:cnblogs.com/panchanggui/p/10766607.html MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,flo ...
- 什么是浮点型?什么是单精度浮点数(float)以及双精度浮点数(double)?
前言 作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型 首先明确java中浮点型数据类型主要有:单精度float.双 ...
- decimal类型对象里面定义什么类型_MySQL中Decimal类型和Float Double的区别(详解)
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...
- C语言中float,double类型,在内存中的结构(存储方式).
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度. 任何数据在内存中都是以二进制(0或1)顺序 ...
最新文章
- 打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
- 面向对象的三大特性(封装、继承、多态)
- element tree 点击文字都也可以勾选_任何时候都能用得到的CAD实用技巧!掌握它,分分钟提高工作效率...
- c多线程并发处理方式_ElasticSearch 并发的处理方式:锁和版本控制
- Hibernate程序性能优化的考虑要点
- 【错误异常大全】:ArcGIS Engine中C#无法引用ESRI.ArcGIS.AxControls问题
- hadoop-2.7.2 分布式集群搭建
- 【Luogu 3389】【模板】高斯消元法(用高斯消元求解线性方程组)
- windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法...
- 【策划方案手段】为本单位精心打造一场专业电视台效果的知识竞赛,如何搞?如何花钱最少?
- node.js Web实时消息后台服务器推送技术---GoEasy
- 如何用计算机制作pop海报,怎么用ps制作pop海报_ps制作pop字体
- 九宫格游戏(java实现)
- 2018年sfdc工作总结_常见Salesforce 异常
- 投稿动态无法删除的情况下,如何批量删除B站动态?
- 综合日语第一册第八课
- python词语匹配相似度_python文本相似度计算
- [转]java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码
- .NET 5.0 正式版发布了!
- 苹果cms微信对接php,苹果cmsV10微信公众号对接插件安装教程
热门文章
- Doris之物化视图
- scala中zip拉链的操作
- python找到文件夹下指定文件类型_python 读取指定文件夹中的指定文件类型的文件名...
- 类和对象编程(六):内联函数
- 最小二乘法详解(线性拟合与非线性拟合)
- 基于内容的视频语义标注(一)——视频标注的三种方法和不同层次划分标注
- windows rt运行android,Move from Android to WinRT
- debian、ubuntu安装metasploit通用方法
- jsp页面运行的步骤以及原理
- Appium - WebView測试(Android)