( 2022-09-30 00:28:51 编辑完的,雪藏了很久,今天有时间了,把浮点数除法搜来补上)
上周地图经纬度出的bug搞得我精疲力竭,总是莫名其妙的就点就飞到不知道哪里去了。qt版本又旧没有isNan函数,愣是找了2天多。最后发现是double数据传递给float出问题了。
软件搭架子的工作多了,数值计算这里的经验都空白了,索性记录一下。
〇、int型就不会出现这些,直接崩溃……
除零中断:
一、nan
一般出现这个代表非法浮点运算
nan: not a number,表示“无效数字”。
如果表达式中含有nan,那么表达式的结果为nan
二、INF
一般出现这个代表结果溢出
INF:infinite,表示“无穷大”。
超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值)。
+inf大于任何数(除了它自己和nan),-inf小于任何数(除了它自己和nan),得到inf时就查看是否有溢出或者除以0。inf在C语言表达式中就表示数学里无限的概念,如1.0/inf等于0.0,并可以与其他浮点数进行比较的(可以参与<=、>+、==、!=等运算)。
三、Qt中识别nan和inf的函数
这里为了跨平台,我只介绍qt的函数
int isfinite(x) ,判断x是否有限,是返回1,其它返回0;
int isnormal(x),判断x是否为一个数(非inf或nan),是返回1,其它返回0;
int isnan(x),当x时nan返回1,其它返回0;
int isinf(x) ,当x是正无穷是返回1,当x是负无穷时返回-1,其它返回0。有些编译器不区分。
四、浮点表示,解析以上原因
这里有一篇我之前写的博客内容详细数字类型的输出:
c语言输出0.000000或乱码,深究_超自然祈祷的博客
计算机组成原理的浮点表示:
浮点除法:
- 除数为0,被除数不为0: 结果为无穷大。在IEEE 754标准下就是阶码全为1,尾数全为0。
- 除数被除数都为0:结果是NAN(not a number)。在IEEE 754标准下阶码全为1,尾数非0。
(——以下截图在慕课截取的)
1.运算步骤:
1-阶码运算
2-尾数运算
3-尾数规格化
4-舍入
5-溢出判断
2.浮点除法运算规则
3.浮点乘法运算举例(除法类似)
浮点除法这玩意好像很复杂,随便找找的都是略过……
部分参考:
C、C++中出现nan、inf原因_LaugustusJ的博客
C语言中的nan和inf 的判断和使用_大作家佚名的博客