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

我们先来看一下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. ActiveMq Windows 配置优化

    最近ActiveMQ 5.15.3 会报 OutofMemory的错误 在 wrapper.conf中 #wrapper.java.additional.8=-Dorg.apache.activemq ...

  2. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

  3. Linux Simple Systemd Service Guide

    Simple Systemd Service Guide 主题 Systemd介绍 Systemd基本操作 怎样编写_service_.service文件 怎样部署service Systemd介绍 ...

  4. C语言典型编程2

    关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种. //任意整数的任意次方取后3位(算数取位)#include<st ...

  5. ELK日志分析平台搭建

    ELK平台介绍 在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自:http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志.应 ...

  6. UDP广播 MAC地址

    enduser_setup.start() ListenPort = wifi.setmode(wifi.STATIONAP) wifi.sta.autoconnect() clientid = wi ...

  7. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录

    CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录: 0.Windows 10本机下载Xshell,以方便往Linux主机上上传大文件 1.CentOS7+CDH5.14.0安 ...

  8. 思科模拟器GNS3-2.1.8安装笔记 (适用于版本2.0.3以上的GNS3)

    当前现阶段学习经常使用的路由交换设备主要来自于思科.华为和华三三家,这三家的设备操作配置大致类似,却又不尽相同.因为实体设备通常都非常昂贵,所以作为学习,我们通常会使用它们提供的模拟器.华为的模拟器是 ...

  9. Sublime Text 执行后只有运行时间,没有执行结果!解决方法!

    问题:build完python代码,只输出:[Finished in 0.2s] 分析:操作回忆:开始是可以看到运行结果的,后来在Tools>>Build with 选择了"Sy ...

  10. RestSharp发送请求得到Json数据

    NUGET安装:RestSharp code: public string Post(string url, string content) { string contentType = " ...