C++的nan、inf

( 2022-09-30 00:28:51 编辑完的,雪藏了很久,今天有时间了,把浮点数除法搜来补上)

上周地图经纬度出的bug搞得我精疲力竭,总是莫名其妙的就点就飞到不知道哪里去了。qt版本又旧没有isNan函数,愣是找了2天多。最后发现是double数据传递给float出问题了。

软件搭架子的工作多了,数值计算这里的经验都空白了,索性记录一下。

〇、int型就不会出现这些,直接崩溃……

除零中断:

C++的nan、inf_第1张图片

一、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或乱码,深究_超自然祈祷的博客-CSDN博客_c语言输出为0.0000

计算机组成原理的浮点表示:

C++的nan、inf_第2张图片

浮点除法:

  • 除数为0,被除数不为0: 结果为无穷大。在IEEE 754标准下就是阶码全为1,尾数全为0。
  • 除数被除数都为0:结果是NAN(not a number)。在IEEE 754标准下阶码全为1,尾数非0。

(——以下截图在慕课截取的)

1.运算步骤:

1-阶码运算

2-尾数运算

3-尾数规格化

4-舍入

5-溢出判断

2.浮点除法运算规则

C++的nan、inf_第3张图片

3.浮点乘法运算举例(除法类似)

C++的nan、inf_第4张图片

浮点除法这玩意好像很复杂,随便找找的都是略过……

部分参考:

C、C++中出现nan、inf原因_LaugustusJ的博客-CSDN博客_c++ inf

 C语言中的nan和inf 的判断和使用_大作家佚名的博客-CSDN博客_c nan

你可能感兴趣的:(c++,开发语言)