检查 NaN 数据值 (C/C++/Python 实现)
NaN 是 Not a Number 的缩写.它是一个数值类型值,通常在浮点计算中,表示未定义或无法表示的值.而且,不能直接使用相等运算符 (==) 检查 NaN.由于在程序中,nan == nan (C/C++/Python) 或 nan is nan (Python) 总是返回 0 或 False.因此,除了采用库函数外,往往可以利用这个性质检查某个数值是否为 NaN.下面介绍如何采用库函数检查 NaN 值:
C/C++ 实现
在 C/C++ 中,采用 math.h 标准函数库中的 isnan 宏或函数检查 nan 值,具体示例代码如下:
C 代码 test-nan.c
/* isnan example */
#include <stdio.h> /* printf */
#include <math.h> /* isnan, sqrt */ int main()
{
printf ("isnan(0.0) : %d\n",isnan(0.0));
printf ("isnan(1.0/0.0) : %d\n",isnan(1.0/0.0));
printf ("isnan(-1.0/0.0) : %d\n",isnan(-1.0/0.0));
printf ("isnan(sqrt(-1.0)): %d\n",isnan(sqrt(-1.0)));
return ;
}
编译和运行结果,如下所示
$ gcc test-nan.c -lm
$ ./a.out
isnan(0.0) :
isnan(1.0/0.0) :
isnan(-1.0/0.0) :
isnan(sqrt(-1.0)):
C++ 代码 test-nan.cpp
/* isnan example */
#include <cmath> /* isnan, sqrt */
#include <iostream> using namespace std; int main()
{
cout << "isnan(0.0) : " << isnan(0.0) << endl;
cout << "isnan(1.0/0.0) : " << isnan(1.0/0.0) << endl;
cout << "isnan(-1.0/0.0) : " << isnan(-1.0/0.0) << endl;
cout << "isnan(sqrt(-1.0)): " << isnan(sqrt(-1.0)) << endl; return ;
}
编译和运行结果,如下所示
$ g++ test-nan.cpp
$ ./a.out
isnan(0.0) :
isnan(1.0/0.0) :
isnan(-1.0/0.0) :
isnan(sqrt(-1.0)):
如果在编译时增加 -std=c++11 ,采用C++ 2011标准编译程序,可能会出现如下错误:
$ g++ test-nan.cpp -std=c++
...
error: call of overloaded ‘isnan(double)’ is ambiguous
...
一个简单的解决方法是在所有的 isnan 宏或函数前,增加域操作符( :: ),修改后的示例代码如下:
/* isnan example */
#include <cmath> /* isnan, sqrt */
#include <iostream> using namespace std; int main()
{
cout << "isnan(0.0) : " << ::isnan(0.0) << endl;
cout << "isnan(1.0/0.0) : " << ::isnan(1.0/0.0) << endl;
cout << "isnan(-1.0/0.0) : " << ::isnan(-1.0/0.0) << endl;
cout << "isnan(sqrt(-1.0)): " << ::isnan(sqrt(-1.0)) << endl; return ;
}
保存后,重新编译运行即可.
Python 实现
Python 采用 numpy 数值数学库函数 np.isnan 检查 nan 值,示例代码 test-nan.py 如下:
#!/usr/bin/env python
# -*- coding: utf8 -*-
# author: klchang
from __future__ import print_function import numpy as np print ("isnan(0.0) : ", np.isnan(0.0))
print ("isnan(1.0/0.0) : ", np.isnan(np.true_divide(1.0, 0.0)))
print ("isnan(-1.0/0.0) : ", np.isnan(np.true_divide(-1.0, 0.0)))
print ("isnan(sqrt(-1.0)): ", np.isnan(np.sqrt(-1.0)))
运行输出结果,如下:
$ python test-nan.py
isnan(0.0) : False
...: RuntimeWarning: divide by zero encountered in true_divide
print ("isnan(1.0/0.0) : ", np.isnan(np.true_divide(1.0, 0.0)))
isnan(1.0/0.0) : False
...: RuntimeWarning: divide by zero encountered in true_divide
print ("isnan(-1.0/0.0) : ", np.isnan(np.true_divide(-1.0, 0.0)))
isnan(-1.0/0.0) : False
...: RuntimeWarning: invalid value encountered in sqrt
print ("isnan(sqrt(-1.0)): ", np.isnan(np.sqrt(-1.0)))
isnan(sqrt(-1.0)): True
参考资料
1. isnan macro/function - <cmath> reference. http://www.cplusplus.com/reference/cmath/isnan/
2. NaN - Wikipedia, the free encyclopedia. https://en.wikipedia.org/wiki/NaN
3. numpy isnan - NumPy Manual. https://docs.scipy.org/doc/numpy/reference/generated/numpy.isnan.html
4. Why is isnan ambigous and how to avoid it? - stackoverflow. https://stackoverflow.com/questions/33770374/why-is-isnan-ambiguous-and-how-to-avoid-it
检查 NaN 数据值 (C/C++/Python 实现)的更多相关文章
- Python过滤掉numpy.array中非nan数据实例
代码 需要先导入pandas arr的数据类型为一维的np.array import pandas as pd arr[~pd.isnull(arr)] 补充知识:python numpy.mean( ...
- 深入对比数据科学工具箱:Python和R之争
建议:如果只是处理(小)数据的,用R.结果更可靠,速度可以接受,上手方便,多有现成的命令.程序可以用.要自己搞个算法.处理大数据.计算量大的,用python.开发效率高,一切尽在掌握. 概述 在真实的 ...
- 一文总结数据科学家常用的Python库(上)
概述 这篇文章中,我们挑选了24个用于数据科学的Python库. 这些库有着不同的数据科学功能,例如数据收集,数据清理,数据探索,建模等,接下来我们会分类介绍. 您觉得我们还应该包含哪些Python库 ...
- 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)
目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...
- 总结数据科学家常用的Python库
概述 这篇文章中,我们挑选了24个用于数据科学的Python库. 这些库有着不同的数据科学功能,例如数据收集,数据清理,数据探索,建模等,接下来我们会分类介绍. 您觉得我们还应该包含哪些Python库 ...
- ADO.NET笔记——利用Command对象的ExecuteScalar()方法返回一个数据值
相关知识: 有些SQL操作,例如SUM,只会从数据库返回一个数据值,而不是多行数据 尽管也可以使用ExecuteReader()返回一个DataReader对象,代表该数据值,但是使用Command对 ...
- JS 操作一个数据值
任何语言都有自己的操作数据的方法: Js也不例外,js有3种重要的方式来操作一个数据值. 1>复制它.例如把它赋给一个新的变量. 2>把它作为参数传递给一个函数或方法. 3>可以和其 ...
- 【NLP】3000篇搜狐新闻语料数据预处理器的python实现
3000篇搜狐新闻语料数据预处理器的python实现 白宁超 2017年5月5日17:20:04 摘要: 关于自然语言处理模型训练亦或是数据挖掘.文本处理等等,均离不开数据清洗,数据预处理的工作.这里 ...
- Highcharts属性与Y轴数据值刻度显示Y轴最小最大值
Highcharts 官网:https://www.hcharts.cn/demo/highcharts Highcharts API文档:https://api.hcharts.cn/highcha ...
随机推荐
- Scrapyd-Client的安装
1. pip安装 这里推荐使用pip安装,相关命令如下: pip3 install scrapyd-client 2.验证安装 安装成功后会有一个可用命令,叫作scrapyd-deploy,即部署命令 ...
- python怎么解决用matplotlib画图时无法显示中文的问题或者出现方框的问题
在中文前面加上u 加上u以后如果还不可以显示中文显示了方框 就直接加上 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei']
- PHP-GD库开发手记
创建带有alpha通道的背景输出图像画中文字体获取长宽等比例缩放图片,也可以用于裁切实例代码 创建带有alpha通道的背景 $png = imagecreatetruecolor(800, 600); ...
- Linux下ls命令使用详解(转)
说明:我们在linux下使用ll时,其实就是ls -l.ls才是最终的命令程序. ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,List即列表的意 ...
- net与树莓派的情缘-安装与卸载MySql(五)
安装MySql sudo apt-get install mysql-server 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0s ...
- 【Kafka】Consumer配置
从0.9.0.0开始,下面是消费者的配置. 名称 描述 类型 默认值 bootstrap.servers 消费者初始连接kafka集群时的地址列表.不管这边配置的什么地址,消费者会使用所有的kafka ...
- 用idea搭建一个简单的SSM的Demo
1.新建一个maven web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...
- vue数组进行分组
数组进行分组使用switch方法 <template> <v-layout> <v-card contextual-style="dark" v-if ...
- Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”
在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...
- 小菜读书---《Effective C#:改善C#程序的50种方法》
一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量) ...