您的位置:首页 > 编程语言 > C语言/C++

Mohican_12/5 C语言—浮点 运算符

2017-12-06 00:59 169 查看
浮点数存储详解以及算法运算符的介绍
摘要:
a. 浮点数在内存中的存储方式
b. 大小端问题
c.算法的理解 算法的运用
d.运算符:算数运算符逻辑运算符等
 关于浮点数:

指数:
指数部分即使用所谓的偏正值形式表示,实际值为表示值与一个固定值(32位的情况是127)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。单精度的指数部分是-126~+127加上127,指数值的大小从1~254(0和255是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。





负数:





我们都知道,1d(十进制,下同)=1h(十六进制,下同),127d=7fh,255d=ffh。那么如果表示负数该如何表示呢,答案说出来基本属于被折叠的那种,-1d=-1h,-127d=-7fh,-255d=-ffh。
计算机的世界过于简单。在计算机里,没有负数和浮点数,数只有一种,就是整数,而且是无符号整数,而且还是有范围的。其他任何的数,都必须靠这一点点无符号整数来表示。我们都知道,计算机里面用二进制存储,那么,如果用n个二进制位来存储一个数的话,这个数能表示的范围就是0到2^n-1。当然,我们希望能够表示负数,所以计算机科学家们发明了补码(除了补码,还有其他表示负数的方法)。
我们以8位整数来举例。在计算机里面,科学家们希望用最高位来表示符号,这样子,数轴就会被分割成两段,0d-127d和128d-255d。补码里面,把红色那一段移动到负数的部分,用来表示负数,也就是说,补码是「255d(FFh)来表示-1d」,而不是说「FFh是-1d」。



(作者:余天升
链接:https://www.zhihu.com/question/20329210/answer/14778331
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)
以下都以-86,并且为8为二进制为例子:

对于+86不用说,其八位二进制表示为:
(一)0 1 0 1 0 1 1 0
对于-86来说,需要将+86按位取反:
(二)1 0 1 0 1 0 0 1
然后再末尾加上1:
b63a

(三)1 0 1 0 1 0 1 0
然后-86转化为八进制就是对(三)式从右向左每三位为一个单元进行计算,不足三位的补1(因为这是补码)得,
(四)6 5 2
同理,将-86转化为十六进制就是对(三)式从右往左每四位为一个单元进行计算不足四位的补1(因为这是补码)得:
(五)A A
所以-86的二进制,八进制,十六进制分别为(三),(四),(五)式
浮点数:



问题:
浮点数与0比较:
因为浮点数的精度限制,它不可能与整数精确比较,只能逼近那个整数,一般直接把整数与浮点数比较都是错误的。
《高质量C编程》:
4.3.3 浮点变量与零值比较
【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。

千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设浮点变量的名字为x,应当将 

if (x == 0.0) // 隐含错误的比较

转化为 
if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允许的误差(即精度)。
引入头文件:
#include <float.h>float.h里面有许多关于浮点类型的定义。
如:
FLT_EPSILON

DBL_EPSILON

LDBL_EPSILON

部分问题解疑: https://www.cnblogs.com/youxin/p/3306136.html http://blog.csdn.net/ivy8966/article/details/68485520

大小端存放:
小端:低地址放低数据:PC    Inter
大端:低地址放高数据:手机,网络

if 和 switch的区别
if else 表示两个或少量分支的嵌套,
如果用的太多就可以用switch 和 case
从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止。随后,switch语句将结束,程序从switch结束大括号之后的第一个语句继续执行,并忽略其他case。

假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句。

假如表达式的值和任何一个case标签都不匹配,同时没有发现一个default标签,程序会跳过整个switch语句,从它的结束大括号之后的第一个语句继续执行。

汇编指令
汇编指令大全:http://blog.sina.com.cn/s/blog_71899d520102vfi5.html
mov 
add
push
call
cmp
eax
dword ptr
ecx
ebx
esp
ebp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: