数与计算机 (编码、原码、反码、补码、移码、IEEE 754、定点数、浮点数)

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷
测试环境:
ubuntu 18.04
Linux 4.15.0-54-generic #58-Ubuntu SMP Mon Jun 24 10:55:24 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

起因

有些时候,在测试深度学习的模型的时候,特别是模型出问题,或者其他乱七八糟的原因,你会发现某些层的某些特征会出现INF和NAN(特别是转换模型)。说实话,这两个一个是无穷大,一个是不是数字,我们都知道这个的意思,但是怎么出现的,可能都忘了。

我如果没有记错的话,数在计算机中的表示是来至于《计算机组成原理》,其中介绍了很多很多的有趣的原理。但是我出校后,这些理论知识很少和实际联系起来,趁着这次机会,我准备结合我们平常写的代码,理一理计算机中数的这个问题。

符号

在计算机里面,除了指令,就是数值或者符号(统一的说就是数值,因为数值和符号有映射关系,这就是符号编码),我也不知道这样说对不对。
本文主要是说的是数值。对于符号来说,符号涉及到编码问题,有兴趣的可以去了解了解,我们常见的编码就是ascii,utf-8, unicode,gbk,big5等等,这些编码涉及到符号显示的问题。

数值

数值大致有两类表示法,一类是定点数,一类是浮点数。
计算机中,对于整数来说,就是定点数表示法(这里对于整数的说法我也不太确定对不对,相关资料也没有查到明确的说法,但是我理解的是整数就是定点数表示法中,小数点在最右边),对于实数来说,就是浮点数表示法。

整数

在计算机中,在说明整数的定点数表示之前,还得说几个书上的理论:
原码:原码就是十进制转换为二进制。
反码:原码取反。
补码:反码+1。
(注意:如果是符号数,反码和补码运算不影响符号位。)

在计算机中,正整数的补码反码原码一样,负整数的补码是原码取反加1。

对于整数来说,可以分为有符号还是无符号的整数。

无符号数,是正整数,所以在计算机中是补码表示,且就是其十进制转换为二进制。

有符号整数,如果是正整数,计算机中补码表示,且就是其十进制转换为二进制(补码原码一样),如果是负整数,在计算机中表示,且就是其十进制转换为二进制,取补码。

实数

在计算机中,在说明浮点数表示法之前,还得说两个理论:
移码:N-M转换为二进制,M为偏移数。

二进制浮点数:整数部分直接转换为二进制(除2逆序取余),小数部分逼近求和(乘2正序取整)。(更详细的百度随便找个教程即可,我这里只是简单写一下)

规范化二进制浮点数:小数点前只有一个1。

IEEE 754:IEEE根据一些历史因素,定制的大部分通用的浮点数表示方法。以单精度浮点数为例,31位表示符号位,23-30位表示exponent(偏移数是M,指数为E.),0-22表示base(底数为B),表示的浮点数为:B*(2^(E-M))

IEEE 754有很多特殊值,也有一些溢出规则和约等于规则,一般来说,除非你要做科学运算,平常你是遇不到的,简单了解一下即可。
IEEE 754规定的特殊值:
在这里插入图片描述
在这里插入图片描述
注意:其实浮点数还有其他的一些异常计算及表示,详细的请查看ieee 754 chapter7

实例分析

上面扯了半天,大家都看烦了,其实都是一些书本上的知识整理。
下面是实例源文件。

#include <cstring>
int main(int argc , char * argv[])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值