double型数据内存存储方式问题 10C

日常调试时发现一个问题,感觉与浮点数在内存中的存储方式有关,但又不知道其中的规律,还请大牛进行讲解。
简单的验证代码如下:
int main(int argc, const char * argv[]) {
// insert code here...
double x_1 = 2.3991;
double x_2 = 2.4991;
double z_1 = x_1*10000;
double z_2 = x_2*10000;
int y_1 = (int)(z_1);
int y_2 = (int)(z_2);
return 0;
}
运行结果为:
y_1 = 23990 ; y_2=23991;
其中,单步运行的情况如下图所示:图片说明

2

2个回答

0

double、float等浮点型数据在内存中的表示如下:(十进制采用科学计数法)阶码表示指数部分、尾码表示小数部分。
当我们把一个十进制的数转换成二进制的时候可能出现无限循环的情况,如十进制的0.2转换成二进制表示的时候就会无限循环。
然而在机器中(假设32位),double占据8B,其中15或16bits用于表示小数部分,那么此时对于无限循环的情况只能近似表示。
那么在转换成十进制的时候自然而然存在精度缺失的现象,如你单步运行所看到的现象所示。
那么为了解决这种问题,通常我们对于浮点数的操作都是采取近似的方法,如浮点数的比较在精度范围内相等则默认两个数相等等等。

0
chloe_0906
Chloe_0906 回复JockJo: 嗯,好的,感谢
接近 2 年之前 回复
jinjifang
JockJo 回复Chloe_0906: 我在我自己的电脑上跑了下,64位环境,codeblocks IDE,结果是23990 24991。所以这个与不同的机器有关吧。这种问题如果还深究我就不懂了,不过之前我从这种问题中得出的结果就是以后写程序尽量不要这么写
接近 2 年之前 回复
jinjifang
JockJo 回复Chloe_0906: 我只能解释double z_1 = x_1*10000; double z_2 = x_2*10000;这两个是双浮点型表达式,所以10000转换成浮点型的时候,不同的机器对其表达方式不一样,所以运算结果的到的也是一个近似表达,然后再强制转换成int型的时候,也会产生精度的变化。所以结果会和预想不的不一样。
接近 2 年之前 回复
chloe_0906
Chloe_0906 对不起说错了,为什么都是乘以10000,2.399099998和2.499099999会有不同的结果
接近 2 年之前 回复
chloe_0906
Chloe_0906 回复JockJo: 我的疑问在于,强制转换时是如何操作的,为什么23990.999···6和24990.999···9强制转换之后的结果不同
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
float和double类型数据在内存中的存储方法
今天面试遇到这样一个奇葩问题,觉得奇葩的同时觉得,这么基本的储存为什么我会不懂,还一直跟计算机打交道,有点惭愧。float和double类型数据在内存中的存储方法 浮点数(单精度的float和双精度的double)在内存中以二进制的科学计数法表示,表达式为N = 2^E * F;其中E为阶码(采用移位存储),F为尾数。float和double都由符号位、阶码、尾数三部分组成。float存储时使用4...
double数据的内存存储方式
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。          任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 111
float与double在内存中储存的形式
float占用4字节,即32bit。由三部分构成,符号位,指数以及底数。 因为指数可正可负,所以要根据IEEE规定将减去127来表示符号,所以float的指数可从-126到128。
C语言中float, double类型在内存中的存储方式
本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgXnSlpof5pKKJbjScy1StbVdiUWARuAYUIYiyHeTIIhVaz3    C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,
double类型数据在内存中中存储格式
double类型数据在内存中中存储格式一个值为-1.35的float类型数据,它在存储器里面怎么存储,存放的格式是什么 应该是ieee standard 754的存储方式。 也就是第一位是符号位,然后是8位指数位,然后是23位尾数IEEE Standard 754 for Binary Floating-Point Arithmetichttp://www.wikilib.com/wiki?t
float/double类型变量的存储方式
种类-------符号位----------------------指数位-------------------尾数位float-------第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)如:8.25(十进制)  ==> 1.00001 * 23,内存分布如下:double-------第63位(占1bit)---第62-52位(占11bit)-...
C/c++语言中 float double在内存中的存储结构详解
转至博客:http://blog.csdn.net/todd911/article/details/14224249  C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用 64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,
c++ double类型存储
在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。 无论是float还是double,在内存中的存储主要分成三部分,分别是: (1)符号位(Sign):0代表正数,1代表负数 (2)指数位(Exponent):用于存储科学计数法中的指
int、unsigned int、float、double和char在内存中存储方式
2017-12-28 创建人:Ruo_Xiao 实验环境:vs2010、Intel 邮箱:xclsoftware@163.com 2018-01-16 修改人:Ruo_Xiao 添加对移位存储的说明。 零、基础知识 原码、反码和补码是计算机存储数字的编码方式(表示方法)。 拓展:ASCII码、utf-8和utf-16是计算机存储字符的编码方式。 原码:符号位+数值的绝对值。 (1
Java中float和double类型在内存中的存储结构
float类型(32位): 分为:符号位S_指数位E_尾数位M 1bit(符号位) 8bits(指数位) 23bits(尾数位)   double类型(64位): 分为:符号位S_指数位E_尾数位M 1bit(符号位) 11bits(指数位) 52bits(尾数位) 特别注意的是指数位存放的是补码,底数是2!   具体举例: float f = 8.5f;...
c语言 float double数据类型的内存中的存储和验证
c语言中的float , double 等数据类型的存储,如何计算 , 如何用vc vs查看内存
float:double类型数据在内存中中存储格式
float/double类型数据在内存中中存储格式 float/double类型数据在计算机是如何存储的呢? 它们是ieee standard 754的存储方式。 譬如float数,第一位是符号位,然后是8位指数位,然后是23位尾数;double双精度格式为8字节64位,由三个字段组成:52位小数f,11位偏置指数e,以及1位符号s,这些字段连续存储在两个32位字中。存储结构 类型 符号
[转]浮点数在计算机中存储方式与浮点(float,double)不精确问题
作者: jillzhang 联系方式:jillzhang@126.com C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还...
float型数据在内存中的存储方式
float型数据的取值范围在-3.4*10^38到+3.4*10^38次之间,其取值范围跟其在内存当中的存储方式(以科学计数法存储)有关: float型数据在内存当中占4个字节,分布如下: 1bit(符号位)        8bit(指数位)      23bit(尾数位) 其中,符号位决定数值的正负,0表示正数,1表示负数; 指数位由8位二进制数表示无符号整数0~255(由于有符号数通常
C中char和float在内存中的储存方式_VS_C_17/11/15
我们要想了解基本数据类型在内存中的储存方式就必须先要知道这些数据类型在内存在所占的字节数,但c的标准中并没有对此具体规定。而且这个也与操作系统和编译器有关,比如同样是int类型的数据在不同的编译器中有4和2两种字节储存方式。 虽然没有具体规定,但其有一定的原则: sizeof(short int)<=sizeof(int) sizeof(int)<=sizeof(long int)
java中double类型的内存表示
转自[http://bbs.csdn.net/topics/260050279] 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为...
Double型数据的存储方式和计算方法
Double型数据的存储方式是什么? 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:             符号位     阶码      尾数     长度 float           1      
float,double浮点数的二进制存储方式及转换
float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。     无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储尾数部分(Mantissa):尾数部分 其中float的存储
C语言:自己动手查看float以及double类型的变量2.5在内存中的存储方式。
编写如图程序。650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7A/B8/wKioL1axxW2y-E7gAAAXd7bmMF8639.png" title="4S)WJ__YZ7]7{2%@%J_PF_P.png" alt="wKioL1axxW2y-E7gAAAXd7bmMF8639.png" />Fn+F10进调试界面,F1
int类型在内存中的存储方式
此文为个人作为初学者的学习记录 Q1:int类型在内存中是以何种方式存储的? 要解决这个问题,我们需要首先比较深入地理解下int类型。 { 本文中的int类型的相关数据,如无特别说明都以32位操作系统下的VC++6.0编译器环境为准。 在下表中可以看到,int类型表示带有符号的整型,而unsigned int类型为无符号的整型。 类型名称 占字节数
float 在内存中的储存方式
float 在内存中的储存方式 C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用 64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float还是double在存
【C++学习笔记】对float型数据类型和double型数据的理解
简单的说,float型数据是指用科学计数法储存的数据。 在内存中,float型数据的储存分两部分:第一部分:0.123456(六位小数,小于1),第二部分:10^n(控制小数点的位置)。 这种储存数据的方法使float型数据有一下特点: 1、可以储存小数 2、只有六位有效数字(因此float不可能储存所有的数,比如0.1234567,7会消失,或者12345678,7和8会消失)。
C/C++中基本数据类型在内存中是如何存储的
(1)char char是字符型,占用一个字节,即8位: 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 即有2^8=256个状态,可以表示256个不同的值,只是当有符号和无符号时表示的范围不同,我们平时的所用的每一个字符在内存中都由8位2进制数来表示,比如字符’A’
浮点型数据存储方式浅析
学习目标: ①   搞懂float和double型数据的存储方式 ②   实现浮点型二进制和十进制的相互转换 ③   了解float和double类型的取值范围及其精度的由来   浮点型作为Java基础数据类型,分为float和double两种类型,其中float类型占4个字节,32个bit位,double占8个字节,64bit位。先说float类型的存储方式,而double类型也可以以
float和double在内存中的存储
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。   任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2 字节)的short int型变量的值是2^8(=256),那么它的二进制表达就是:00000001 00
c/c++中各数据类型在内存中的存储方式
基本的数据类型有: int    4 long   4 short   2 signed char 1 unsigned char 1 unsigned long  4 unsigned short 2 float 4 double 8   基本为: char   1字节 short  2字节 int    4字节 long   4字节 float  4字节 do
C++float数据在内存中的表示形式
简单地说,一个float型实数在内存中占4个字节,即32个二进制bit,从低位到高位依次叫第0位到第31位.这32 位可以分为3个部分:符号位(第31位),阶码(第30位到第23位共8位),尾数(最低23位)。  1、符号位。最高位也就是第31位表示这个实数是正数还是负数,为0表示正数或0,为1表示负数.  2、阶码。第30位到第23位这8个二进制位表示该实数转化为规格化的二进制实数
浮点型数据在计算机内存中存储原理
浮点型数据在计算机内存中存储原理: 1、float占32bit,double占64bit; 2、float和double存储精度:     float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度     double可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度 3、遵循的规范: 不论是float还是double在存储方式上都是遵从I
python实现double型浮点数在内存中的存储样式转换接口
话不多说 ,直接上代码 import decimal def convertDouble2Bin(double):       """      function:将十进制双精度数转化为内存中存储的二进制数     eg: convertDouble2Bin(double)      return:内存中的二进制串          double in sram:
字符数据在内存中的存储形式及其使用方法
/*将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元去,而是将该字符 相应的ASCII代码放到存储单元中。既然字符数据以ASCII代码存储的,他的存储形式就与整数的存储形式类似。 这样,在C++中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量,反之,一个整型数据 也可以赋给一个字符变量。也可以对字符数据进行算术运算,此时相当于对他们的ASCII码进行算术运...
Java中float和double类型的数据在内存中是怎样存放的
转自   http://bbs.csdn.net/topics/260050279
float类型在内存中的存储方式
float在内存中的存储遵循IEEE 754标准。在C/C++中,float类型占4个字节即32位 , 这32位分成了3部分:        符号位:转化成二进制后,第31位。 0代表正数,1代表负数        阶码:30-23位,转化成规格化的二进制之后与127之和        尾数:22-0位     例如:13.625在内存中的存储        首先将13.625转化成二
java-16位内存数据转化为double型
使用java语言实现16位内存数据转化为double型
double型数据与float型数据在内存中的存储
double类型与float类型相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,通常情况,float占4字节(32位)内存空间,其数值范围为-3.4E38~3.4E+38,;双精度型占8 个字节(64位)内存空间,其数值范围为-1.7E308~1.7E+308。1、float类型数字在计算机中用4个字节存储。遵循IEEE-754格式标准:一个浮点数有2部分组成:底数m和...
java各种数据类型在内存中的存储方式
原文:https://www.cnblogs.com/yale/p/4605004.html 1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题。(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。 释放:对象的释放是由垃圾回收机制决定和执行的
int型整数在内存中的存储方式
int类型在内存中的存储 起因:话说楼主在写一个将string类型转化为int类型的函数,就是把atoi()这个函数重写一下,当考虑到溢出这种情况的时候,写下了这样一行代码: if((!minus&&num>0x7fffffff)||(minus&&num<ffffffff)){ num=0; break; } 注:bool minus 是判断该数字是正还是负。 等到测
C语言中字符型在计算机中的存储
一. 字符型的分类和表示范围        char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论                    表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号位之后,后七位是数据位,所以它的取值范围是-128---127(-2^7---2^7-1)        signed char :有符号数,
深入谈谈整型、浮点型在内存中的存储方式
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 分享一个大神朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程。写得特别用心喔~ →→→→→→大神朋友简介:从事十几年人工智能研究,麻省理工博士学位,目前在百度继续进行着人工智能的研究。。。▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲...
short与int型在内存中的存储形式
int main() { char p[4]={1,2,3,4}; cout<<*((short*)p)<<endl; cout<<*((short*)p+1)<<endl; return 0; }结果 程序运行的结果为上述的原因是: 计算机有字节顺序之分,这与机器有关,分为低端字节计算机和高端字节计算机, 所以在不同的计算机里,存储形式可能不一样。 在低端字节计算机中
数据(整型数、浮点数)在计算机内存中的存储方式
数据在内存中有两种存储方式:大端模式(bigg Endian)以及小端模式(little Endian) (1)大端模式是高位数据存在低位地址中,而低位数据存在高位地址中 (2)小端模式与大端模式恰好相反 下面,我来举一个例子,大家有很容易明白了 比如一个要把一个十进制的0x12345存入内存中(16位为一个单位),则 大端模式:                           (
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链问题 s型排序分班java代码