在java中Float源码中static public boolean isNaN(float v) { return (v != v); }方法,v != v是什么意思?

v!=v是永远返回false?这样看起来怪怪的,麻烦高手解决一下。谢谢!... v != v 是永远返回false? 这样看起来怪怪的,麻烦高手解决一下。
谢谢!
展开
 我来答
百度网友5afe5bb
2020-03-31 · TA获得超过675个赞
知道答主
回答量:150
采纳率:0%
帮助的人:43.8万
展开全部

这么久的老问题了, 还没采纳, 对于这种提问但不采纳的问题其实根本不想回复,,, 不过作为自己梳理和对于其他同样有这个疑问可能看到的这个提问的人的参考, 还是可以简单说下自己的理解:

java的Float里面定义了一个NaN字段,其值就是0.0f/0.0f ;

这个值本身比较特殊,它表示的是一个非数值的状态或者说类型, 这个值不等于任何值,包括它自己(大致可以理解为NaN与NaN之间是同类,虽然我们是同类但是我不是你,更深层的原因我觉得可能是每个NaN都会分配一个单独的地址来放, 所以导致NaN==NaN的时候比较内存地址一定会返回false,也就是NaN!=NaN的时候一定是true).

除此之外, 还有一些别的特殊之处可以参考: Float里面有一个native方法叫: intBitsToFloat(Int),这个方法注解中提到它处理值的时候有两个特殊考虑:

一个就是,实现时考虑了这个值NaN值, 注解原文意思是这个值通过iniBitsToFloat处理出来后会跟自己相等(所以Float对象值是NaN的时候, 使用equals方法比较另一个NaN的变量值时是相等的结果), 并且这里还定义了NaN大于所有其他值(甚至包括比浮点数的正无穷大要大);

第二个,也挺有意思, 就是规定了-0.0f 是小于 0.0f的;

以上两个是native方法实现本身逻辑就已经是这样的事实了(可以称为设计如此吧);


写了半天, 估计看的人还不如字数多,要不后面还是发CSDN吧....

晋小雨5l
2012-02-29 · TA获得超过324个赞
知道答主
回答量:133
采纳率:100%
帮助的人:73.8万
展开全部
NaN的意思是 not a number 不是一个数字。从方法名上看来,这是判断一个参数是否为数字。这段源码,我是没看过。我感觉应该是用在重载上面的,就是说他分别使用int float long 这些来判断是否为数字。如果你的v是一个数字就会返回false,不是NaN,就是,不是 不是 一个数字,就是说是一个数字。这里有点绕。 呵呵,希望对你有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1339744936
2020-04-15
知道答主
回答量:7
采纳率:0%
帮助的人:6199
展开全部

最近在看源码也是遇到了同样的困扰,搜索了一波无果,想到了从字节码的角度去探索(v!=v),首先对isNaN进行编译,javap -v,配合下图应该能够理解,关于fcmpl的实现暂未找到,期待大佬释疑。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
511313651
2019-03-29 · TA获得超过951个赞
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:96.5万
展开全部
public static void main(String[] args) {
float f = 0.0f/0.0f;
System.out.println(f);//打印NaN
System.out.println(isNaN(f));//true
}
程序上有太难的问题得去google,这是我搜到的答案。
当一个返回值为浮点数的表达式运算时,如果运算时的参数会导致结果是未定义的,比如0.0f/0.0f,再比如负数开平方,那么这个表达式的值就是NaN,意思是这不是一个数。其实查api,Float中有个常量Float.NaN,就是表示这个玩意儿。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liyi830813
2012-02-28 · TA获得超过952个赞
知道小有建树答主
回答量:1034
采纳率:0%
帮助的人:964万
展开全部
/**
* Returns <code>true</code> if the specified number is a
* Not-a-Number (NaN) value, <code>false</code> otherwise.
*
* @param v the value to be tested.
* @return <code>true</code> if the argument is NaN;
* <code>false</code> otherwise.
*/
static public boolean isNaN(float v) {
return (v != v);
}
请看说明,注释中已经说了如果值为NaN则返回true
NaN是什么值请看http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105e8d3d4f07dd743ca080462482d45f93130a1c187ba0fc7063565f8e99616307ac4c5febf5366537747af1c4969c0f80fbc42773db7b23706d913112c468d8dc3756d654e64de8df0e96c9e74396b9d3a3c82520dd23056df1f19c2a06&p=9c759a46d78c12a052f6d068525c&user=baidu&fm=sc&query=NaN+%B2%CE%CA%FD%CA%C7%CA%B2%C3%B4&qid=b497df310abf133d&p1=1
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式