小白的CTF学习之路3——二进制数据基础与运算(下)
处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算
我们先来看一下float事列程序:
#include<"stdio.sh">
int main()
{
float sun=0;
for(int i=0;i<100;i++)
{
sun+=0.1;
}
printf("%f",sun);
return 0;
}
这是一个比较简单的C语言循环,可能有没接触过C语言的同学,不要紧,这个程序的大致意思是让这个sum值循环100次,每次加0.1,我们思考下程序的运行结果,我想大多数人都会觉得程序会输出10,接下来我们放到程序中运行一下
emmmmm....看来结果并非我们的预期,为什么会出现这种情况?这里我们需要了解到一个概念
二进制是如何表示小数的?
例如二进制:1011.0011
小数点前正常计算,小数点后面按照二的负一次方,二的负二次方等等以此类推
这样我们就有了一个问题,二的负一次方二的负二次方等等依次表示0.5,0.25,0.125等等等等这些数值,那么我们如何用二进制表示类似0.9这样的数值呢?
我们可以用二的负二次方加上二的负二次方以此类推,直到加到无限接近于0.9的这个数值为止,但是我们得到的这个数值永远无法等于0.9,这就是为什么我们的计算机再计算我们上面的循环中会出现误差的原因
就好比我们是在向天平中放置筹码,每增加一个筹码就无限接近于平行,但是永远也无法精准的测量出物体的值
我们了解了二进制表达小数的不足之后,也要知道计算机是如何实现二进制的,计算机里是没有小数点位的,那么我们怎么实现浮点数在计算机当中的实现的呢?这里我们就引入了一个IEEE编码,IEEE将内存分为几大块,转化完后生成10110011,将小数点左移,移到最前面1的位置,01100110000....放到32位里面,拿1与127进行运算,当然这些了解就OK,我们需要记住的是,IEEE编码存储浮点数,0.1x100不等于10怎样处理?
我们了解到,计算机中的浮点数运算时及其不安全的,那么我们怎样让0.1x100等于10呢?我们将我们的程序稍微改动一下:
#include<stdio.h>
int main()
{
float sun=0
for (int i=0;i<100;i++)
{
sun+=0.1*10;
}
printf("%f",sun/10);
return 0;
}
ok我们现在来看下结果

大家应该都看懂程序的意思了吧?既然我们的浮点数无法实现正确输出,那么我们就将我们的浮点数变为正整数,在输出的时候再变回浮点数,在这种情况下,我们就可以实现正确运算了!
当然,出现这种极端情况我们有两种处理办法
- 当整数运算
- 忽略
当整数运算我们可以理解,那么忽略呢?因为我们大多数的浮点数计算误差不会对程序造成影响,所以这种情况我们一般选择忽略
通过这一章我们了解了浮点数的实现和误差处理办法,浮点数在计算机当中是不安全的
小白的CTF学习之路3——二进制数据基础与运算(下)的更多相关文章
- 小白的CTF学习之路2——二进制数据基础与运算(上)
今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...
- 小白的CTF学习之路1——程序与CPU
刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要 ...
- 小白的CTF学习之路4——内存
明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...
- 小白的CTF学习之路8——节约内存的编程方式
今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...
- 小白的CTF学习之路7——内存与硬盘
前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...
- 小白的CTF学习之路6——阶段测评
刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的 C A: 运算器 B: 寄存器 C: 内存 D: 时钟 这是一道送分题,CPU包含以下几种原 ...
- 小白的CTF学习之路5——内存的逻辑结构
很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐 内存的逻辑结构大致分为以下几种: 数组 栈与队列 链表 二叉树 以上,数组,栈,链表是我这章要说明的 在学习前需要了解的两个问题: 1.内存 ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
- 新手小白的Linux学习之路
大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...
随机推荐
- Java并发编程随笔
死锁:两个线程互相等待对方释放锁才可以继续运行. 避免死锁的常见方法: 1.避免一个线程同时获取多个锁 2.避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源 3.尝试使用定时锁,使用l ...
- 基于C/S 结构的IM即时通讯软件--下篇
3.实现界面事件函数 客户端:单击" 进入" 按钮发送请求,如果要与服务器通信,必须要同时发送结构体信息描述发送内容,便于服务器处理. void CCase010Dlg::OnBn ...
- 批处理BAT运行不显示DOS窗口的方法
新建记事本,写入下面内容 set ws=wscript.createobject("wscript.shell") ws.run "D:\scripts\svn-upda ...
- FireDAC 连接SQL Server一些要注意的地方(转)
TFDConnection: FetchOptions.Mode 设置为fmAll, 返回全部结果, 否则默认只返回前50条, 效果与open以后再执行FetchAll一样 Specifies how ...
- Word2vec教程
Word2vec Tutorial RADIM ŘEHŮŘEK 2014-02-02GENSIM, PROGRAMMING157 COMMENTS I never got round to writi ...
- 吴裕雄 python 机器学习——分类决策树模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_s ...
- TODO:BGP 建立过程
//TODO: Quagga 实时监控配置文件
- 云笔记项目-Spring事务学习-传播REQUIRES_NEW
接下来测试事务传播的REQUIRES_NEW. Service层 Service层代码在这里不展示了,主要将EMPService1Impl类中的方法事务传播属性设置为REQUIRED,EMPServi ...
- C#中生成GUID的四种格式
var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12 var uuidN = Guid.NewGu ...
- 解题(ConflictPhoneNumber--冲突的电话号码)
题目描述 移动推出的校内网短号和亲情网短号非常方便,但在某款新手机里却出现了尴尬的bug.例如,当通讯录中包含如下号码时:1.小王:6002.小李:4676543.小张:600010输入600时,手机 ...