我认为对NaN进行任何数学运算的结果都应该返回一个NaN,但是Math.round(Float.NaN)==0Math.round()的这种行为的基本原理是什么??奇怪的是,C#的行为不同:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx 最佳答案 Math.round()定义为(long)Math.floor(a+0.5d).如果a是NaN,则a+0.5d是NaN。Math.floor()委托(delegate)给StrictMath.floor()传入NaN时返回NaN。
为什么这个比较给了我“假”?我查看了源代码,Float.NaN被定义为/***AconstantholdingaNot-a-Number(NaN)valueoftype*float.Itisequivalenttothevaluereturnedby*Float.intBitsToFloat(0x7fc00000).*/publicstaticfinalfloatNaN=0.0f/0.0f;编辑:令人惊讶的是,如果我这样做:System.out.println("FC"+(Float.compare(Float.NaN,Float.NaN)));它给了我0。所以Float.compar
据我了解,java会将float作为具有以下属性的32位整数存储在内存中:第一位用于确定符号接下来的8位代表指数最后23位用于存储小数这没有为三种特殊情况留下多余的位:NaN正无穷负无穷我可以猜到负0可以用来存储其中一个。这些实际上是如何在内存中表示的? 最佳答案 Java指定float遵循IEEE754标准。这是它的存储方式:位0:符号位位1到11:指数第12至63位:分数现在,我用不同的double值执行了以下方法:publicstaticvoidprint(doubled){System.out.println(Long.to
为什么无限比较不遵循应用于NaN的逻辑?此代码打印出false三次:doublea=Double.NaN;doubleb=Double.NaN;System.out.println(a==b);//falseSystem.out.println(ab);//false但是,如果我将Double.NaN更改为Double.POSITIVE_INFINITY,我得到true表示相等,但false用于大于和小于比较:doublea=Double.POSITIVE_INFINITY;doubleb=Double.POSITIVE_INFINITY;System.out.println(a==b
终端输出:Now:{_d:SatJan13201802:39:25GMT-0400(AST),_isUTC:false,_a:null,_lang:false}ExpirationDate:{_d:WedFeb13201302:00:15GMT-0400(AST),_isUTC:false,_a:null,_lang:false}DifferencebetweenNowandExpirationDate:NaN代码:console.log('DifferencebetweenNowandExpirationDate:',now.diff(expDate,'months',true));
在编写一些测试用例时,一些测试会检查NaN的结果。我尝试使用std::isnan但断言失败:Assertion`std::isnan(x)'failed.打印x的值后,结果是负的NaN(-nan),这在我的情况下是完全可以接受的。在尝试使用NaN!=NaN并使用assert(x==x)后,编译器帮了我一个忙并优化了断言离开。制作我自己的isNaN函数也正在被优化掉。如何检查NaN和-NaN的相等性? 最佳答案 这很尴尬。编译器(在本例中为GCC)优化比较并且isnan返回false的原因是因为我的团队中有人打开了-ffast-数学.
我将使用C++进行一些数学计算。输入的float是一个有效的数字,但是经过计算,结果是NaN。我想跟踪出现NaN值的点(可能使用GDB),而不是在代码中插入很多isNan()。但是我发现即使是这样的代码在出现NaN值时也不会触发异常。doubledirty=0.0;doublenanvalue=0.0/dirty;谁能建议一种方法来跟踪NaN或将NaN变成异常? 最佳答案 既然你提到使用gdb,这里有一个适用于gcc的解决方案——你想要fenv.h中定义的函数:#define_GNU_SOURCE#include#includein
在C++中使用NaN的最佳方式是什么?我找到了std::numeric_limits::quiet_NaN()和std::numeric_limits::signaling_NaN().我想使用signaling_NaN表示一个未初始化的变量如下:doublediameter=std::numeric_limits::signaling_NaN();但是,这会在分配时发出信号(引发异常)。我希望它在使用时引发异常,而不是在分配时引发异常。有什么方法可以使用signaling_NaN没有提出分配异常(exception)?signaling_NaN有没有好的便携替代品?使用时会引发浮点异
我对IEEE-754浮点比较规则的理解是,除了!=之外的所有比较运算符如果其中一个或两个参数都是NaN,则返回false,而!=运算符将返回true。我可以通过简单的独立测试轻松重现此行为:for(intii=0;ii%s\n",a,#OP,b,aOPb?"true":"false");TEST()TEST(=)TEST(==)TEST(!=)}这会打印出预期的结果:(NaN在MSVC运行时中被格式化为-1.$)1.0true1.0>2.0=>false1.0true1.0>=2.0=>false1.0==2.0=>false1.0!=2.0=>true-1.$false-1.$>2.
我最近阅读了很多关于IEEE754和x87架构的内容。我正在考虑在我正在处理的一些数字计算代码中使用NaN作为“缺失值”,并且我希望使用信号NaN可以让我在我不想的情况下捕获浮点异常继续“缺失值”。相反,我会使用安静的NaN来允许“缺失值”通过计算传播。但是,信号NaN并不像我认为的那样基于它们上存在的(非常有限的)文档工作。这是我所知道的摘要(所有这些都使用x87和VC++):_EM_INVALID(IEEE“无效”异常)在遇到NaN时控制x87的行为如果_EM_INVALID被屏蔽(异常被禁用),则不会产生异常并且操作可以返回安静的NaN。涉及信号NaN的操作将不是导致抛出异常,但