为什么我会得到以下内容:
>>> v
nan
>>> type(v)
<type 'numpy.float64'>
>>> v == np.nan
False
>>> np.isnan(v)
True
Run Code Online (Sandbox Code Playgroud)
我原以为这两个应该是等价的?
例如,考虑一下
bool fun (double a, double b) {
return a < b;
}
Run Code Online (Sandbox Code Playgroud)
fun如果任何参数是NaN 会返回什么?这是未定义/实现定义的行为吗?
其他关系运算符和相等运算符会发生什么?
我想知道为什么undefined == undefined但是NaN != NaN.
我知道IEEE 754定义NaN具有以下按位表示:
0或11位0位,因为该位模式被保留用于表示无穷大当计算输入为NaN时,有效载荷会传播(就像整个NaN一样)到浮点计算的结果,尽管我不知道这种传播的细节,或者标准是否指定了如何完成.谁设置原始有效载荷?如果我添加两个具有不同有效负载的NaN会发生什么?
但最重要的是:我从未见过以前使用的NaN有效载荷.这个有效载荷字段有什么用途?
这怎么可能是假的?
console.log(parseInt(undefined));
//NaN
console.log(parseInt(undefined)===NaN);
//false
Run Code Online (Sandbox Code Playgroud)
这看起来很愚蠢
每次客户输入数量时,我都会尝试显示小计.但是,当我循环输入时,我得到一个NaN总数.我相信它可能是我subtotal在我的脚本中声明变量的方式,但我之前没有遇到过这个:
$('.item-qty input').bind('keyup', function(){
var subtotal = 0.0;
$('.item-qty input').each(function(){
var class = $(this).attr('id');
var qty = $(this).val();
var price = $('.'+class).html();
price = parseFloat(price);
qty = parseInt(qty);
subtotal = subtotal + (price * qty);
});
$('.subtotal input').val(subtotal);
});
Run Code Online (Sandbox Code Playgroud) 我只是想使用一个蒙面数组来过滤掉一些nan条目.
import numpy as np
# x = [nan, -0.35, nan]
x = np.ma.masked_equal(x, np.nan)
print x
Run Code Online (Sandbox Code Playgroud)
这输出如下:
masked_array(data = [ nan -0.33557216 nan],
mask = False,
fill_value = nan)
Run Code Online (Sandbox Code Playgroud)
调用np.isnan()的x返回正确的布尔数组,但面具似乎并不工作.为什么我的面具不能像我期望的那样工作?
我有一个Pandas数据帧,我正在插入SQL数据库.我正在使用Psycopg2直接与数据库通信,而不是SQLAlchemy,所以我不能使用内置to_sql函数的Pandas.除了numpy np.NaN值作为NaN转换为文本并插入到数据库中之外,几乎所有内容都按预期工作.它们确实应该被视为SQL null值.
所以,我正在尝试创建一个自定义适配器来将np.NaN转换为SQL null,但我尝试的所有内容都会导致在数据库中插入相同的NaN字符串.
我目前正在尝试的代码是:
def adapt_nans(null):
a = adapt(None).getquoted()
return AsIs(a)
register_adapter(np.NaN, adapt_nans)
Run Code Online (Sandbox Code Playgroud)
我已尝试过这个主题的一些变化,但没有任何运气.
我的一位同事发现了Delphi编译的Win32和Win64代码在处理NaN方面的差异.以下面的代码为例.当以32位编译时,我们得不到消息,但是当用64位编译时,我们得到两个比较返回true.
program TestNaNs;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Math;
var
nanDouble: Double;
zereDouble: Double;
nanSingle: Single;
zeroSingle: Single;
begin
SetExceptionMask(exAllArithmeticExceptions);
nanSingle := NaN;
zeroSingle := 0.0;
if nanSingle <> zeroSingle then
WriteLn('nanSingle <> zeroSingle');
nanDouble := NaN;
zereDouble := 0.0;
if nanDouble <> zereDouble then
WriteLn('nanDouble <> zeroDouble');
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
我对IEEE标准的理解是<>应该返回true,但所有其他操作都应该返回false.所以在这种情况下,看起来64位版本是正确的,32位版本是不正确的.两者生成的代码与生成SSE代码的64位版本非常不同.
对于32位:
TestNaNs.dpr.21: if nanSingle <> zeroSingle then
0041A552 D905E01E4200 fld dword ptr [$00421ee0]
0041A558 D81DE41E4200 fcomp dword ptr [$00421ee4]
0041A55E 9B wait
0041A55F DFE0 fstsw ax
0041A561 9E …Run Code Online (Sandbox Code Playgroud) 我正在设计一个新的微处理器指令集(www.forwardcom.info),我想使用NAN传播来跟踪错误.但是,IEEE 754浮点标准中有许多奇怪的事情可以防止这种情况发生.
首先,我想使用NAN传播而不是错误捕获的原因是我有可变长度的向量寄存器.例如,如果我有一个带有8个元素的浮点向量,并且我在第一个元素中有1/0而在第六个元素中有0/0,那么我只得到一个陷阱,但如果我在计算机上运行相同的程序矢量长度的一半然后我得到两个陷阱:一个用于无穷大,一个用于NAN.我希望结果与向量长度无关,所以我需要依赖于NAN和INF的传播而不是陷阱.NAN和INF值将通过计算传播,以便在最终结果中检查它们.NAN表示包含一些称为有效负载的位,可用于有关错误源的信息.
但是,IEEE 754浮点标准中存在两个阻止NAN值可靠传播的问题.
第一个问题是具有不同有效载荷的两个NAN的组合只是两个值中的一个.例如,NAN1 + NAN2给出NAN1.这违反了a + b = b + a的基本原则.编译器可以交换操作数,以便在不同的编译器或不同的优化选项上获得不同的结果.我更喜欢得到两个有效载荷的按位OR组合.如果每个错误条件都有一位,那么这将起作用,但当然,如果有效负载包含更复杂的信息(例如具有动态类型的语言中的NAN装箱),则无效.标准委员会实际讨论了OR'ing解决方案(参见http://grouper.ieee.org/groups/754/email/msg01094.html).我不知道他们为什么拒绝这个提议.
第二个问题是如果只有一个输入是NAN,则min和max函数不传播NAN.换句话说,min(1,NAN)= 1.可靠的NAN传播当然需要min(1,NAN)= NAN.我不知道为什么标准会说这个.
在名为ForwardCom的新微处理器系统中,我想避免这些不幸的怪癖并指定NAN1 + NAN2 = NAN1 | NAN2和min(1,NAN)= NAN.
现在我的问题是:首先,我是否需要一个选项切换来在严格的IEEE一致性和可靠的NAN传播之间进行切换?引用标准:
安静的NaN应该由实施者自行决定提供从无效或不可用的数据和结果中继承的回顾性诊断信息.为了便于传播NaN中包含的诊断信息,应尽可能多地保留NaN操作结果中的信息.
注意标准在这里说"应该",在其他地方有"应该".这是否意味着我允许偏离建议?
第二个问题:我找不到任何实际使用NAN传播来跟踪错误的例子.也许这是因为标准的弱点.我想为不同的错误条件定义不同的有效负载位,例如:
0/0,0*∞,∞/∞,模(1,0),模(∞,1),∞-∞,以及涉及无穷大和除零的其他误差.
sqrt(-1),log(-1),pow(-1,0.1)以及从对数和幂导出的其他错误.
asin(2)和其他数学函数.
明确的分配.当变量初始化为NAN时,这可能很有用.
用户定义的错误代码有很多空位.
这是否已经完成,或者我是否必须从零开始创造一切?我有什么问题需要考虑(除了某些语言的NAN拳击)