为什么要翻倍呢IsNaN的实现如此奇怪

亚历克斯·朱可夫斯基(Alex Zhukovskiy)

因此,如果反编译.net源代码,则可以找到此代码

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SecuritySafeCritical]
[__DynamicallyInvokable]
public static unsafe bool IsNaN(double d)
{
  return (ulong) (*(long*) &d & long.MaxValue) > 9218868437227405312UL;
}

所以根据IEEE754 NaN != NaN

所以问题很简单:为什么看起来不像

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SecuritySafeCritical]
[__DynamicallyInvokable]
public static unsafe bool IsNaN(double d)
{
  return d != d;
}

我的朋友告诉我,==可能是return !IsNan(this) && this.InnerEquals(other);

但是NaN的afaik实现是在处理器本身的硬件层上进行硬编码的。而且我们不应该NaN单独处理案件。


还有一个问题。为什么这么傻?

bool b1 = (double.NaN == double.NaN); // false
bool b2 = double.NaN.Equals(double.NaN); //true

http://ideone.com/ZSRYz1

我知道一个实现

[__DynamicallyInvokable]
public override bool Equals(object obj)
{
  if (!(obj is double))
    return false;
  double d = (double) obj;
  if (d == this)
    return true;
  if (double.IsNaN(d))
    return double.IsNaN(this);
  else
    return false;
}

但是不知道为什么

紫罗兰色

在IEEE754中,对NaN值进行编码,使其符号位为0或,1并且所有1的指数部分小数部分中的值无关紧要,只要它们不是所有0位即可(如果是,则是无穷大之一,而不是NaN)。

因此,请考虑32位单精度浮点数:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
x 11111111 ???????????????????????

我已使用m(尾数表示)上面的分数位,以免将其与十六进制数字混淆f

如果不是所有这些?位都为零,则为NaN编码之一。如果将其强制转换为32位长,则检查二进制文件很简单:

x 11111111 00000000000000000000000

并且,如果它大于正变体或小于负变体,则为NaN编码之一。

忽略了该&操作正在执行的符号,因为带符号的long.MaxValue将是2^63 - 1(假设是64位),因此该操作只会将最高有效位强制为0

魔术值是由一个0符号位,所有1的指数构成的(对于双精度,其中有11个以及0分数中的所有位。因此为二进制:

seee eeee eeee mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
0111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

0x7ff00000000000009218868437227405312

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的Stack实现中的第98个元素如此奇怪?

来自分类Dev

为什么Elasticsearch索引工作如此奇怪?

来自分类Dev

为什么子进程行为如此奇怪?

来自分类Dev

使用TensorFlow进行梯度下降比基本的Python实现要慢得多,为什么呢?

来自分类Dev

为什么允许在实现中放置@interface中的ivar覆盖,但是这种奇怪的行为呢?

来自分类Dev

Lua为什么要进行比较呢?

来自分类Dev

Oracle为什么要如此大量更新其Java平台?

来自分类Dev

什么是样板代码?为什么要避免呢?

来自分类Dev

为什么总和语句如此奇怪地合成?

来自分类Dev

为什么此JavaScript函数的行为如此奇怪?

来自分类Dev

为什么在c中以如此奇怪的顺序执行代码?

来自分类Dev

为什么总和语句如此奇怪地合成?

来自分类Dev

为什么Java转换具有如此奇怪的语法?

来自分类Dev

CSS文件排序很重要,如果要,为什么呢?

来自分类Dev

位域,为什么要具体实现?

来自分类Dev

为什么要实现继承的抽象方法?

来自分类Dev

位域,为什么要具体实现?

来自分类Dev

为什么要实现继承的抽象方法?

来自分类Dev

Android的EventBus实现,为什么要反思

来自分类Dev

使用eval()的奇怪的关闭行为-为什么呢?

来自分类Dev

呼叫/抄送发生了奇怪的事情,为什么呢?

来自分类Dev

为什么LinqToEntities跳过/采用oracle实现如此缓慢

来自分类Dev

为什么我的MemoryManager和我的MemoryPool实现如此缓慢?

来自分类Dev

为什么bash在Windows的boot2docker中如此缓慢呢?

来自分类Dev

为什么不能在WindowAdapter中实现某些方法呢?

来自分类Dev

Outlook中的蓝线是什么?为什么它的行为如此奇怪?

来自分类Dev

为什么平均数不会翻倍?

来自分类Dev

为什么SQL/PHP输出的信息翻倍?

来自分类Dev

为什么在转换/复制矢量时要进行如此多的复制

Related 相关文章

  1. 1

    为什么我的Stack实现中的第98个元素如此奇怪?

  2. 2

    为什么Elasticsearch索引工作如此奇怪?

  3. 3

    为什么子进程行为如此奇怪?

  4. 4

    使用TensorFlow进行梯度下降比基本的Python实现要慢得多,为什么呢?

  5. 5

    为什么允许在实现中放置@interface中的ivar覆盖,但是这种奇怪的行为呢?

  6. 6

    Lua为什么要进行比较呢?

  7. 7

    Oracle为什么要如此大量更新其Java平台?

  8. 8

    什么是样板代码?为什么要避免呢?

  9. 9

    为什么总和语句如此奇怪地合成?

  10. 10

    为什么此JavaScript函数的行为如此奇怪?

  11. 11

    为什么在c中以如此奇怪的顺序执行代码?

  12. 12

    为什么总和语句如此奇怪地合成?

  13. 13

    为什么Java转换具有如此奇怪的语法?

  14. 14

    CSS文件排序很重要,如果要,为什么呢?

  15. 15

    位域,为什么要具体实现?

  16. 16

    为什么要实现继承的抽象方法?

  17. 17

    位域,为什么要具体实现?

  18. 18

    为什么要实现继承的抽象方法?

  19. 19

    Android的EventBus实现,为什么要反思

  20. 20

    使用eval()的奇怪的关闭行为-为什么呢?

  21. 21

    呼叫/抄送发生了奇怪的事情,为什么呢?

  22. 22

    为什么LinqToEntities跳过/采用oracle实现如此缓慢

  23. 23

    为什么我的MemoryManager和我的MemoryPool实现如此缓慢?

  24. 24

    为什么bash在Windows的boot2docker中如此缓慢呢?

  25. 25

    为什么不能在WindowAdapter中实现某些方法呢?

  26. 26

    Outlook中的蓝线是什么?为什么它的行为如此奇怪?

  27. 27

    为什么平均数不会翻倍?

  28. 28

    为什么SQL/PHP输出的信息翻倍?

  29. 29

    为什么在转换/复制矢量时要进行如此多的复制

热门标签

归档