检查 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 ...
随机推荐
- hibernate关联关系的crud之级联
cascade级联,只会影响CRUD的CUD,不会影响读取.不设置级联,从多的一方能读出一的一方,设了级联,从一的一方,默认也不能读出多的一方. 如果两个对象之间有关联,不管是一对多,多对一,单向还是 ...
- 使用nginx反向代理jenkins
1.在Jenkins 官方网站(http://jenkins-ci.org/)下载最新版本war包.拷贝到 $TOMCAT_HOME/webapps 下(不用解压).启动tomcat服务. 2.找到n ...
- redis linux安装过程回顾
1,官网wget http://download.redis.io/releases/redis-3.2.9.tar.gz 2,解压 tar zxf redis-3.2.9.tar.gz 后进入解压后 ...
- 解决图片浮动调节不了的问题(使用vertical-align属性)
vertical-align: middle; vertical-align 属性设置元素的垂直对齐方式. baseline 默认.元素放置在父元素的基线上.sub 垂直对齐文本的下标.super ...
- 微服务Kong(三)——添加一个API
在开始前,请确保您已经安装了KONG服务,并且已经启动了KONG服务. 在本节中,您可以学习到:如何在KONG层添加一个API.这是您使用KONG来管理您的API的第一步.对于此篇教程,我们将使用 h ...
- Java新特性之Nashorn的实例详解
Nashorn是什么 Nashorn,发音“nass-horn”,是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScrip ...
- sdfsdfsdf
i- i- i-1i- i- i- i- i- i-
- C# 程序执行时间差
有时需要知道执行一个方法需要多少时间,这时会用到一个时间差TimeSpan DateTime startTime = DateTime.Now;//方法开始时间 //{ // 你需要测试的代码. // ...
- 十、spark graphx的scala示例
简介 spark graphx官网:http://spark.apache.org/docs/latest/graphx-programming-guide.html#overview spark g ...
- bnu 10805 矩形神码的 平面向量的运行
矩形神码的 Time Limit: 1000ms Memory Limit: 65536KB Special Judge 64-bit integer IO format: %lld J ...