ITPub博客

首页 > > > float 和 double (我内存里的浮点型数据?(二)

float 和 double (我内存里的浮点型数据?(二)

作者:dapan 时间:2018-11-29 10:19:35 0 删除 编辑

前面的文章

嵌入式Linux:float 和 double (我内存里的浮点型数据?)​zhuanlan.zhihu.com图标

我记得之前在数据类型里面说过一个概念,棱子,也叫模子

我们经常说取模,取模,也是这个道理

比如一个

char i = 350;

那么这个i 取模后,肯定没有350,因为i的模子大小char,char的模子大小是

0~255 - 一共256个数


所以上面的 printf("%d",i) 输出的应该是 350 - 256 = 94


但是浮点数是不支持模运算的,所以引进了溢出这样的说法

  • nan = not a number =表示不是一个实数
nan 不等于任何浮点数值,包括它自身在内;即它与任何数比较均返回false。
  • inf = Infinity 无穷大 (包括正数无穷大和负数无穷大)

我们数学里面有实数,所以C语言里面有了浮点型,想用浮点型来表实实数,但是如果这个实数的小数点无限长,就不可能真实的表达这个实数,所以,只能近似的表示实数。


列举man和inf的几个情况

  • x / 0.0 = +inf 当 x > 0.0
  • x / 0.0 = -inf 当 x < 0.0
  • 0.0 / 0.0 = nan
  • 0.0*∞ = nan
  • ∞ * ∞ = nan
  • (+inf)+ (+inf ) = inf
  • (+inf)+ (- inf ) = nan
  • x /+∞ = +0.0
  • x /-∞ = - 0.0

我们用一个C程序验证一下

#include<stdio.h>

void main(void)
{
    float x = 1.2;
    
    printf("%f\n",x/0.0);
    printf("%f\n",-x/0.0);
    printf("%f\n",0.0/0.0);
    printf("%f\n",0.0*(x/0.0));
    printf("%f\n",(x/0.0)*(x/0.0));
    printf("%f\n",x/0.0 + x/0.0);
    printf("%f\n",x/0.0 - x/0.0);
    printf("%f\n",x/(x/0.0));
    printf("%f\n",x/(-x/0.0));
}

输出

如何实现一个通用的判断来判断数据是inf或者nan呢?

首先,对于 Nan,可以用下面的代码实现:

bool IsNumber(double x)
{
    // 这里的比较操作看上去总是会得到 true
    // 但有趣的是对于 IEEE 754 浮点数 NaN 来说总会得到 false!
    return (x == x);
}

而下面的代码可以判断一个浮点数是否是有限的(finite, 即既不是 NaN 又不是 infinite):

bool IsFiniteNumber(double x)
{
    return (x <= DBL_MAX && x >= -DBL_MAX);
}
//其中,DBL_MAX 是 <float.h> 中预定义的常量。

把上面两个函数结合起来,还可以实现一个浮点数是否是 Inf 的判断。


欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87074