# !isnan.() doesn't work

**URL:** <https://discourse.julialang.org/t/isnan-doesnt-work/37934>\
**Category:** General Usage\
**Tags:** question\
**Created:** [April 20, 2020, 10:22pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934 "2020-04-20T22:22:59Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jing\_Zhang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jing_zhang/32/13737_2.png) [@Jing\_Zhang](https://discourse.julialang.org/u/Jing_Zhang)\
**Post date:** [April 20, 2020, 10:22pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/1 "2020-04-20T22:22:59Z")

</div>

Dear Julia user,

Why does isnan.([0 0/0]) return a 1×2 BitArray{2}: false true, but !isnan.([0 0/0]) return an error message: no method matching !(::BitArray{2})?

Thanks a lot!

---

<div class="post-metadata">

**Author:** ![stillyslalom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stillyslalom/32/45687_2.png) [@stillyslalom](https://discourse.julialang.org/u/stillyslalom)\
**Post date:** [April 20, 2020, 10:30pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/2 "2020-04-20T22:30:33Z")

</div>

Order of operations: broadcasting takes precedence over negation. To enforce the correct order of operations, use `(!isnan).([0 0/0])`, or just broadcast over the whole expression: `@. !isnan([0 0/0])`

---

<div class="post-metadata">

**Author:** ![Jing\_Zhang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jing_zhang/32/13737_2.png) [@Jing\_Zhang](https://discourse.julialang.org/u/Jing_Zhang)\
**Post date:** [April 20, 2020, 10:38pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/3 "2020-04-20T22:38:22Z")

</div>

> [@stillyslalom](#):
>
> @. isnan([0 0/0])

Perfectly solved the problem. Thanks a lot!

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [April 20, 2020, 11:08pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/4 "2020-04-20T23:08:19Z")

</div>

Alternatively, `.!isnan.([1, NaN])`

---

<div class="post-metadata">

**Author:** ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)\
**Post date:** [April 21, 2020, 8:14am UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/5 "2020-04-21T08:14:42Z")

</div>

> [@kevbonham](#):
>
> Alternatively, `.!isnan.([1, NaN])`

That seems pretty unreadable to me!

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [April 21, 2020, 8:37am UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/6 "2020-04-21T08:37:32Z")

</div>

> [@dpsanders](#):
>
> seems pretty unreadable

That’s a matter of taste, but it can also be written as

```julia
@. !isnan([1, NaN])

```

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [April 21, 2020, 10:53am UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/7 "2020-04-21T10:53:31Z")

</div>

I don’t disagree… I like the @. Syntax, but I feel like that would bite me somehow. I usually just stick to `map` 😉

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [April 21, 2020, 12:09pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/8 "2020-04-21T12:09:40Z")

</div>

Note that `map` will return `Bool`ean arrays instead of `BitArray`s.

```julia
julia> map(isodd, 0:10)'
1×11 LinearAlgebra.Adjoint{Bool,Array{Bool,1}}:
 0 1 0 1 0 1 0 1 0 1 0

julia> isodd.(0:10)'
1×11 LinearAlgebra.Adjoint{Bool,BitArray{1}}:
 0 1 0 1 0 1 0 1 0 1 0

```

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [April 21, 2020, 4:21pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/9 "2020-04-21T16:21:07Z")

</div>

To be honest, I don’t know how they’re different…

---

<div class="post-metadata">

**Author:** ![stillyslalom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stillyslalom/32/45687_2.png) [@stillyslalom](https://discourse.julialang.org/u/stillyslalom)\
**Post date:** [April 21, 2020, 4:44pm UTC](https://discourse.julialang.org/t/isnan-doesnt-work/37934/10 "2020-04-21T16:44:23Z")

</div>

Bools are stored using one byte per value, while BitArrays use, like the name implies, one bit per value.

```julia
julia> Base.summarysize(Array{Bool}(undef, 1024))
1064

julia> Base.summarysize(BitArray(undef, 1024))
192

julia> Base.summarysize(BitArray(undef, 0))
64

julia> 1028 ÷ (192 - 64)
8

```
