当前位置: 首页 > news >正文

浮点数 NaN 彻底研究(linux 下 c环境测试)


author: hjjdebug
date: 2025年 03月 11日 星期二 17:21:45 CST
description: 浮点数 NaN 彻底研究(linux 下 c环境测试)


文章目录

    • 1. 创建一个NaN 数据,
    • 2. 打印一个NaN 数据,
    • 3. NaN 到底等于二进制的多少? 即它是怎样表示的?
    • 4. 1.0/0.0 生成的是什么? 是一个无穷大 inf
    • 5. 运算时生成一个nan, 用-1开平方 , 竟然生成了负不存在
    • 6. nan 的运算和判断isnan()

NaN即Not a Num,只对于浮点数出现。用于处理计算中的错误情况

1. 创建一个NaN 数据,

2. 打印一个NaN 数据,

3. NaN 到底等于二进制的多少? 即它是怎样表示的?

看一个简单代码:

$ cat main.cpp 
#include <math.h>
#include <stdio.h>

typedef union
{
	double dbl;
	long int lint;
}U_DATA;

int main() {
	U_DATA data;
    double x = NAN;  // 直接创建NaN
    printf("x = %f\n", x);  // 输出:x = nan
	data.dbl=x;
	printf("double = %f\n", data.dbl);
	printf("long = 0x%lx\n", data.lint);
    return 0;
}

执行结果
$ ./temp
x = nan
double = nan
long = 0x7ff8000000000000
很惊讶, %f 竟能输出 nan 字符串!
这是因为进化的printf 针对这个浮点数进行了特殊处理
当它遇到0x7ff8000000000000, 就打印nan

4. 1.0/0.0 生成的是什么? 是一个无穷大 inf

我本来想让它生成一个无效数,实际它生成的是无穷大数, 顺便也了解一下无穷大数.
代码:

$ cat main.cpp 
#include <math.h>
#include <stdio.h>

typedef union
{
	double dbl;
	long int lint;
}U_DATA;

int main() {
	U_DATA data;
	double a=0.0;
	double x=1.0/a;
    printf("x = %f\n", x);  // 输出:x = nan
	data.dbl=x;
	printf("double = %f\n", data.dbl);
	printf("long = 0x%lx\n", data.lint);
    return 0;
}

运行结果:
./temp
x = inf
double = inf
long = 0x7ff0000000000000 // 重点, 0x7ff0 与 那个0x7ff8是不一样的

printf(“%f”) 对无穷大数也要做特殊处理了.

5. 运算时生成一个nan, 用-1开平方 , 竟然生成了负不存在

代码:

cat main.cpp 
#include <math.h>
#include <stdio.h>

typedef union
{
	double dbl;
	long int lint;
}U_DATA;

int main() {
	U_DATA data;
//    double x = NAN;  // 直接创建NaN
	double a=-1;
	double x=sqrt(a);
    printf("x = %f\n", x);  // 输出:x = -nan, 其值0xfff8, 与正nan(0x7ff8)不同
	data.dbl=x;
	printf("double = %f\n", data.dbl);
	printf("long = 0x%lx\n", data.lint);
    return 0;
}

执行结果:
./temp
x = -nan
double = -nan
long = 0xfff8000000000000

负不存在0xfff8跟12个0 与 正不存在0x7ff8跟12个0 还是不一样的.

6. nan 的运算和判断isnan()

代码:

$ cat main.cpp
#include <math.h>
#include <stdio.h>

typedef union
{
	double dbl;
	long int lint;
}U_DATA;

int main() {
	U_DATA data;
    double x = NAN;  // 直接创建NaN
//这里得到结论, nan 与数据运算还是nan,
//可见浮点数运算对错误进行了特殊处理
	double y=x+1;
    printf("x+1 = %f\n", y);  // 输出:x+1 = nan
	data.dbl=y;
	printf("double = %f\n", data.dbl);
	printf("long = 0x%lx\n", data.lint); //nan还是用0x7ff8开始后跟12个0表示
	if(isnan(y)) //判断y 是否是一个正常的数据
	{
		printf("y is not a number!\n");
	}
	else
	{
		printf("y is a number!\n");
	}
    return 0;
}

执行结果:
$ ./temp
x+1 = nan
double = nan
long = 0x7ff8000000000000
y is not a number!

这里得到结论:
nan 与数据运算还是nan,
可见浮点数运算对错误进行了特殊处理,

它不会傻傻的都按浮点数去运算,而是先判断一下数据是否合法.
你也可以用isnan()判断数据是否合法

相关文章:

  • 贝壳找房:以 OceanBase 为 JuiceFS 元数据引擎,构建 AI 存储底座
  • tomcat配置应用----server.xml文件具体配置
  • Redis Redis介绍、安装 - Redis客户端
  • Linux-基础开发工具
  • 【Academy】JWT 分析 ------ JWT
  • element-plus中form表单组件的使用
  • Python爬虫---中国大学MOOC爬取数据(文中有数据集)
  • 软件工程概述
  • pg_实例架构图解
  • 使用jest测试用例之入门篇
  • python高效试用17---两个字符串组成一个新的字符串和两个字符串组成元组作为key哪个更高效
  • STM32 HAL库 CAN过滤器配置
  • 【网络编程】原始套接字编程
  • 【UI自动化框架第五张】AndroidUiAutomation 类功能简介
  • deepseek R1提供的3d迷宫设计方案
  • freeswitch(多台服务器级联)
  • 文件和异常
  • 串口通信ASCII码转16进制及C#串口编程完整源码下载
  • Dify平台部署全记录
  • Redis--Set类型
  • 网站推广每天必做的流程/seo品牌优化
  • 怎么做asp动态网站/百度竞价优化
  • 专业的销售网站/互联网公司
  • 开发网页系统一般多少钱/seo信息网
  • 沭阳县城乡建设局网站/北京如何优化搜索引擎
  • 网站建设需要哪些必备文件/seo推广的特点