ieee浮点

IEEE浮点标准用符号位、有效数、指数位来表示一个数

符号位:决定是负数(s=1)还是正数(s=0)

有效数:无符号二进制小数(exp)

指数位:2的幂(frac可能为负数),加权

在单精度浮点浮点格式(C语言中的float)中,s、exp、frac域分别为1位、8位、23位,产生一个32位的表示。在双精度浮点格式(C语言中的double)中,s、exp、frac域分别为1位、11位、52位,产生一个64位的表示。

规格化值:exp域不是全0全1, 小数域frac描述小数值f(0<=f<1),有效数定义为M = 1 + f,既然第一位始终为1,我们就不需要显式表示它(隐含的以1开头的表示)

如,若要表示1.5,二进制就是1.1  ==>  0.1*2^0

对于小数位:0.1 即 100 0000 0000 0000

对于指数位:0 偏置形式的有符号数 x - 2^(8-1) = 0, 求得x = 127 即 0111 1111

程序验证:

#include <stdio.h>
#include <stdlib.h>

//模拟小端数据
typedef struct stFloat
{
int frac:23;
int exp:8;
int s:1;
}ST_FLOAT;

int main(int argc, char *argv[])
{
float f;
ST_FLOAT stF;
stF.s = 0;
stF.exp = 0x7f;            // 0111 1111
stF.frac = 0x400000;  // 0100 0000 0000 0000
f = *(float*)(&stF);
printf("%f\n", f);

return 0;
}

[[email protected] C]$ gcc -o ieee ieee.c
[[email protected] C]$ ./ieee
1.500000

非规格化值:指数域全为0,这种情况指数值是1-[2^(8-1)-1] = -126,有效位的值M=f,不包含隐含的1

1)提供了一种表示值0的方法

2)表示那些非常接近于0.0的数,对“逐渐溢出”属性的支持

#include <stdio.h>
#include <stdlib.h>

//模拟小端数据
typedef struct stFloat
{
int frac:23;
int exp:8;
int s:1;
}ST_FLOAT;

int main(int argc, char *argv[])
{
float f;
ST_FLOAT stF;
stF.s = 0;
stF.exp = 0x0;
stF.frac = 0x400000;
f = *(float*)(&stF);
printf("%.42f\n", f);

return 0;
}

二进制126位相当于八进制42位,因此十进制42位有效位我们一定可以看到0.00  05的出现,看输出吧

[[email protected] C]$ gcc -o ieee ieee.c
[[email protected] C]$ ./ieee
0.000000000000000000000000000000000000005877

按说,5后面都应该是0。这个输出也暴露出浮点数的不精确的特点

特殊数值:指数域全为1,看程序吧

#include <stdlib.h>

//模拟小端数据
typedef struct stFloat
{
int frac:23;
int exp:8;
int s:1;
}ST_FLOAT;

int main(int argc, char *argv[])
{
float f;
ST_FLOAT stF;
stF.s = 0;
stF.exp = 0xff;
stF.frac = 0x0;
f = *(float*)(&stF);
printf("%.42f\n", f);

stF.frac = 0x1; //小数位不是全0
f = *(float*)(&stF);
printf("%.42f\n", f);

return 0;
}

输出如下:

[[email protected] C]$ ./ieee
inf
nan

这两个符号,我们应该见过,第一个表示无穷大,第二个表示实数和无穷以外的数

时间: 2024-11-03 21:53:40

ieee浮点的相关文章

IEEE 754 浮点数的表示精度探讨

IEEE 754 浮点数的表示精度探讨 前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处.我曾经做过数值算法程序,虽然基本可用,但是被浮点数精度问题所困扰:事情过后,我花了一点时间搜集资料,并仔细研究,有些心得体会,愿意与大家分享,希望对IEEE 754标准中的二进制浮点数精度及其相关问题给予较为详尽的解释.当然,文中任何错误由本人造成,由我承担,特此声明. 1. 什么是IEEE 754标准? 目前支持二

汇编代码还原第一讲,基本类型以及浮点编码.

目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮点栈 2.浮点汇编 3.使用内联浮点汇编实现加法 四丶布尔类型 地址丶指针丶引用表达形式 常量 #define与const定义 总结: 代码还原技术 一丶简介代码还原 例子一:我们很多人都学习过汇编.但是汇编的核心知识就是我能看的懂.有人拿汇编去做外挂.比如我去追偏移.看着视频去做.然后换一个游戏依

SQLite 数据类型

SQLite 数据类型 参考: SQLite 数据类型 | 菜鸟教程http://www.runoob.com/sqlite/sqlite-data-types.html SQLite 数据类型是一个用来指定任何对象的数据类型的属性.SQLite 中的每一列,每个变量和表达式都有相关的数据类型. 您可以在创建表的同时使用这些数据类型.SQLite 使用一个更普遍的动态类型系统.在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关. SQLite 存储类 每个存储在 SQLit

SQLite3 笔记

SQLite insert 插入一行: 插入一组: 使用select结果插入 多行插入到新表: 多行插入到新表,一步到位: 非常有用的临时表: sqlite update 更新一条记录: update 注意 约束 sqlite delete 约束: 唯一约束unique autoincrement 主键约束 域约束:默认值 时间戳默认值 NOT NULL 约束 check 约束 check 约束 复杂 外键约束 SQLite  存储类 视图 索引 触发器 视图触发器:可更新的视图 事务 冲突 S

计算机硬件架构五

M68000, M68K:这个摩托罗拉68000系列(也被称为680x0,M68000,m68k,或68k)是一个家庭32 复杂指令集计算机(CISC)微处理器.在80年代和90年代初,他们很受欢迎个人电脑和工作站和是主要的竞争对手因特尔的x86微处理器.他们最著名的处理器供电的早熟苹果Macintosh,司令官Amiga,的辛克莱QL,的雅达利ST,的Weatherstar,的世嘉五代(Mega Drive),和其他几个人.虽然没有现代台式电脑是基于68000系列处理器,处理器仍然广泛使用的衍

SQLite:自学笔记(1)——快速入门

SQLite的安装和入门 了解 简单了解SQLite SQLite是一种轻巧迷你的关系型数据库管理系统.它的特点如下: 不需要一个单独的服务器进程或操作的系统(无服务器的). SQLite 不需要配置,这意味着不需要安装或管理. 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件. SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB. SQLite 是自给自足的,这意味着不需要任何外部的依赖. SQLite 事务是完全兼容 AC

20145321 《信息安全系统设计基础》第3周学习总结

20145321<信息安全系统设计基础>第三周学习总结 教材学习内容总结 第二章 信息的表示和处理 计算机存储和处理信息以二值信号表示. 三种最重要的数字表示法 无符号:基于传统的二进制表示法,大于等于0 补码:有符号整数 浮点数:实数的科学计数法的以二进制为基数的版本 p22: 二进制.八进制.十进制.十六进制进制转换(方法:使用二进制作中间结果)十六进制:以0x或0X开头表示,字符A-F可大写.可小写.也可混用. p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的

20145207《信息安全系统设计基础》第3周学习总结

教材学习内容总结 1. 三种重要的数字表示 (1)无符号数.有符号数.浮点数 正数的原码.反码以及补码是其本身. 负数的原码是其本身,反码是对原码除符号位之外的各位取反,补码则是反码加1. (2)为什么用补码表示 能够统一+0和-0的表示 采用原码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 000 0000: 采用反码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 111 1111: 采用补码表示,+0的二进制表示形式为0 000

信息安全系统设计基础期中总结

Chapter 00 Linux基础 man命令调用手册页 man <command_name> 手册通常被分为8个区段,要查看相应区段的内容,就在 man 后面加上相应区段的数字即可: 1 一般命令 2 系统调用 3 库函数,涵盖了C标准函数库 4 特殊文件(通常是/dev中的设备)和驱动程序 5 文件格式和约定 6 游戏和屏保 7 杂项 8 系统管理命令和守护进程 man有一个-k 选项用起来非常好,这个选项让你学习命令.编程时有了一个搜索引擎,可以举一反三.结合后面学习的grep 命令和