小白的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 ...
随机推荐
- [转]NSIS 制作安装包无法创建桌面快捷方式或无法删除开始菜单项
用户将桌面文件转移了,如: D:\Doc\Desktop ,安装程序后,桌面不会生成快捷方式, 或者卸载后,开始菜单中的文件也不会被删除 NSIS卸载后无法删除开始菜单中的内容原因:因为NSIS中使 ...
- mysql安装,以及从csv插入数据
1.mysql安装 用管理员身份打开cmd命令行工具,cd到解压文件的bin目录: ・MySql的Windows服务安装: mysqld install 回车 ・生成无密码的root用户: my ...
- 基于SDL2实现俄罗斯方块
俄罗斯方块有多种旋转规则,我这里采用的是SRS.如果要改变旋转规则的话也很方便. SRS: 内容后续补充.. 代码:https://github.com/CknightX/sdl_Tetris 素材来 ...
- 第二篇 Flask 中的 Render Redirect HttpResponse
第二篇 Flask 中的 Render Redirect HttpResponse 1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返 ...
- 什么是HTML?
html是很多人编程的入门领域.作为初学者,不管你是在哪里学的,学校,视频教程,网络教程等等……它们都会告诉你HTML即:超文本标记语言(Hyper Text Markup Language).但第一 ...
- 网络赛 I题 Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...
- Polar Code(1)极化码SC译码迭代公式的理解
采用对数似然比求解的迭代公式推导: 考虑 如上图,将L的部分看为一个整体,用 exp(a)和exp(b)代替,并对式子左右都取对数,则公式变为如下所示: 对数似然比 上述公式等效一下公式: 进一步可等 ...
- np.where()命令介绍
- MacbookPro下载word文件显示dms怎么办
方法:直接改扩展名!!!!!!!!!! 如果你下载的是word的话,把最后的扩展名.dms改成.doc就可以了. 同理,如果你下载的是rar的话,改成rar就好了.
- 【算法】BM算法
目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...