1.了解float存储结构

float存储结构请看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875

2.float最大值

float结构如下图:
要想获得正最大值,那就令符号位为0,指数位和尾数位全为1,则应该是最大会是,最大值应该为:
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
则float类型十六进制表示为:0x7fff ffff 
 以下是测试代码:
  1. void main(int argc, char* argv[])
  2. {
  3. float a=-8.25;
  4. char *p=(char*)&a;
  5. *p=0xff;
  6. *(p+1)=0xff;
  7. *(p+2)=0xff;
  8. *(p+3)=0x7f;
  9. printf("\n&a=%x",&a);
  10. printf("\na=%f",a);
  11. }

结果并不和我们想的一样,出现了1.#QNAN0,这个我也不知道为什么,知道原因的可以回复!

 
如果指数位最后一位为0,则是我们想要的结果,
我们知道float最大为(2-2^-23)*2^127= 3.4028234663852886*10^38
见float.h
  1. #define FLT_DIG         6                       /* # of decimal digits of precision */
  2. #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */
  3. #define FLT_GUARD       0
  4. #define FLT_MANT_DIG    24                      /* # of bits in mantissa */
  5. #define FLT_MAX         3.402823466e+38F        /* max value */
  6. #define FLT_MAX_10_EXP  38                      /* max decimal exponent */
  7. #define FLT_MAX_EXP     128                     /* max binary exponent */
  8. #define FLT_MIN         1.175494351e-38F        /* min positive value */
  9. #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */
  10. #define FLT_MIN_EXP     (-125)                  /* min binary exponent */
  11. #define FLT_NORMALIZE   0
  12. #define FLT_RADIX       2                       /* exponent radix */
  13. #define FLT_ROUNDS      1                       /* addition rounding: near */
当我们令指数位为:1111 1110 =254 则指数为254-127=127
尾数位全为1,则最大数为1.11111111111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
则十六进制表示为:0x7f7f ffff

3.测试代码:

  1. void main(int argc, char* argv[])
  2. {
  3. float a=-8.25;
  4. char *p=(char*)&a;
  5. *p=0xff;
  6. *(p+1)=0xff;
  7. *(p+2)=0x7f;
  8. *(p+3)=0x7f;
  9. printf("\n&a=%x",&a);
  10. printf("\na=%f",a);
  11. }
 
我们从结果可以看出
&a=12ff44
a=340282346638528860000000000000000000000.000000
这是float的最大值

4.float正最小值

float.h中我们看到float正的最小值为 1.175494351e-38F
  1. #define FLT_MIN         1.175494351e-38F        /* min positive value */

通过了解float类型的结构我们知道如何才能获得正的最小值,要获得正的最小值,我们只要将指数位置成最小及0000 0000 则指数为0-127=-127,然后将尾数位最后一位置1,其它置0

及十六进制为0x0000 00001

5.测试代码

  1. void main(int argc, char* argv[])
  2. {
  3. float a=-8.25;
  4. char *p=(char*)&a;
  5. *p=0x01;
  6. *(p+1)=0x00;
  7. *(p+2)=0x00;
  8. *(p+3)=0x00;
  9. printf("\n&a=%x",&a);
  10. printf("\na=%e",a);
  11. }

我们得到的结果为 1.00000000 00000000 0000 01*2^-127= 5.877472454760670*10^-039,可是结果不是我们预测的!不知道为什么

 
如果将指数位置成1,测试代码如下:
  1. void main(int argc, char* argv[])
  2. {
  3. float a=-8.25;
  4. float b=0;
  5. char *p=(char*)&a;
  6. *p=0x01;
  7. *(p+1)=0x00;
  8. *(p+2)=0x80;
  9. *(p+3)=0x00;
  10. printf("\n %d ",sizeof(a));
  11. printf("\n&a=%x",&a);
  12. printf("\na=%e",a);
  13. }
 
我们看到结果为 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,这是我们想要的结果!

C语言中 Float 数据结构的存储计算的更多相关文章

  1. C语言中float,double类型,在内存中的结构(存储方式)

    C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...

  2. C语言中float如何存储?

    float 内存如何存储的 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 5 ...

  3. C语言中float如何存储?(转载)

    float 内存如何存储的 类型 存储位数 总位数 偏移值(offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 52 ...

  4. c语言中float、double、long double在内存中存储方式

    存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m  和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...

  5. float double 如何存储计算2 (这个写的也不错)

    目前java遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号. 我 ...

  6. 笔试题引出float数据的存储方式的深究

    笔试题: #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h& ...

  7. Java语言中:float、double数据类型在内存中是如何存储的

    引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...

  8. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  9. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

随机推荐

  1. wireshark抓取本地数据包

    windows系统中,本地向自身发送数据包没有经过真实的网络接口,而是通过环路(loopback interface)接口发送,所以使用基于只能从真实网络接口中抓数据的winpcap是无法抓取本地数据 ...

  2. 每日英语:How the College Bubble Will Pop

    The American political class has long held that higher education is vital to individual and national ...

  3. java8的新特性以及用法简介

    1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predic ...

  4. goto语句的升级版,setjmp,longjmp

    我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢? 这就是今天要讲的两个库函 ...

  5. firefox快捷键窗口和标签类

    firefox快捷键窗口和标签类: 关闭标签: Ctrl+W 或 Ctrl+F4关闭窗口: Ctrl+Shift+W 或 Alt+F4向左移动标签: Ctrl+左方向键 或 Ctrl+上方向键向右移动 ...

  6. golang包管理的取巧

    常见的golang的包管理工具 glide 使用yaml做配置,语义化版本管理,可以设置镜像,下载x系列库,但是x系列库被第三方库依赖时会出现下载失败. dep 亲儿子,语义化版本管理,无法解决墙 v ...

  7. phalcon无法更新分区字段解决办法

    表里面有个分区字段,更新后,保存成功,结果实际上数据库没有更新. 后来使用原生sql,解决了这个问题. 获取di中的数据库连接,直接执行sql语句即可,下面的db为注册的数据库服务名 $db = $t ...

  8. Android 开发自己的网络收音机1——功能要求及设计方案

    最近打算利用业余时间,编写一个Android的网络收音机.因为我自己偶尔也喜欢听听广播,所以打算用业余时间编写一个网络版收音机.说起收音机,其实在工作中已经编写过一个,不过那个收音机是需要硬件支持,也 ...

  9. 完美解决PHP中文乱码

    一.首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; cha ...

  10. 【Unity笔记】根骨骼动画/运动(Root Motion)

    根骨骼动画:当动画中角色发生位移后,动作坐标原点跟随角色移动.例如一个向前跳跃的动画,如果在场景中重复该动画,能够看到角色一路往前跳跃,位置一直在前进.适用于有位移的放技能动作等. 非根骨骼动画:当动 ...