处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算

我们先来看一下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——二进制数据基础与运算(下)的更多相关文章

  1. 小白的CTF学习之路2——二进制数据基础与运算(上)

    今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...

  2. 小白的CTF学习之路1——程序与CPU

    刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要 ...

  3. 小白的CTF学习之路4——内存

    明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...

  4. 小白的CTF学习之路8——节约内存的编程方式

    今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...

  5. 小白的CTF学习之路7——内存与硬盘

    前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...

  6. 小白的CTF学习之路6——阶段测评

    刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的  C A:     运算器 B:      寄存器 C:     内存 D:     时钟 这是一道送分题,CPU包含以下几种原 ...

  7. 小白的CTF学习之路5——内存的逻辑结构

    很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐 内存的逻辑结构大致分为以下几种: 数组 栈与队列 链表 二叉树 以上,数组,栈,链表是我这章要说明的 在学习前需要了解的两个问题: 1.内存 ...

  8. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  9. 新手小白的Linux学习之路

    大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...

随机推荐

  1. css:伪类和伪元素

    一:伪类 1.   :active   想被激活的元素添加样式 2.   :focus   向拥有键盘输入焦点的元素添加样式 3.   :hover   当鼠标悬浮在元素上方时,向元素添加样式 4.  ...

  2. PHP5.5.38版本Zend Guard loader for 5.5安装(详细)

    第一次在博客园写东西记录自己,不,可以说第一次在网上写东西记录自己,我只是个菜鸟,具体的不太懂, 但是作为一个菜鸟我肯定把我遇到的问题给详细的表述出来,大神勿喷.在安装Zend Guard loade ...

  3. 查询当前局域网下所有IP和物理网卡地址

    WIN+R –> 打开cmd 键入 arp -a

  4. WordCount编码实现及单元测试(第二次作业)

    项目码云地址:https://gitee.com/zhujunlin/wc.git 一.题目思路 ========== 阅读完题目要求之后我很懵,因为之前从未使用过博客园和码云工具,对编程的目标需求也 ...

  5. 交叉熵理解:softmax_cross_entropy,binary_cross_entropy,sigmoid_cross_entropy简介

    cross entropy 交叉熵的概念网上一大堆了,具体问度娘,这里主要介绍深度学习中,使用交叉熵作为类别分类. 1.二元交叉熵 binary_cross_entropy 我们通常见的交叉熵是二元交 ...

  6. CS通用项目系统搭建——三层架构第二天 (补一篇完整的SqlHelper)

    #region ExecuteNonQuery(如果是增,删,修) /// <summary> /// 执行sql命令 /// </summary> /// <param ...

  7. chrome开发者工具实现整站截屏

    我们经常要遇到将整个网站作为图片保存下来的情况,而windows系统自带的PrintScreen键只能保存当前屏幕的截图 在chrome浏览器中可以安装第三方的截图插件实现整站截图 今天我们要介绍的方 ...

  8. C#移除URL上指定的参数

    /// <summary>        /// 移除URL上指定的参数,不区分参数大小写        /// </summary>        public static ...

  9. zyupload四种不同的PHP上传demo

    PHP结合zyupload多功能图片上传实例,支持拖拽和裁剪.可以自定义高度和宽度,类型,远程上传地址等. zyupload上传基本配置 1 $("#zyupload").zyUp ...

  10. ios 根据 schemes 打开 app

    公司出需求,要让 h5链接直接打开用户的 app,如果没有安装 app 直接跳转到 appStore 这就需要给 app 配置 schemes 即可 1.在Info.plist中 LSApplicat ...