JavaScriptの数値二項演算の表

InfinityやNaNを含めた場合での数値演算結果を確認するための表。

# `a + b`

| `+` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `+0` | `+0` | `+1` | `-1` | `+0.5` | `-0.5` | `+2` | `-2` | `+Infinity` | `-Infinity` | `NaN` |
| **`-0`** | `+0` | `-0` | `+1` | `-1` | `+0.5` | `-0.5` | `+2` | `-2` | `+Infinity` | `-Infinity` | `NaN` |
| **`+1`** | `+1` | `+1` | `+2` | `+0` | `+1.5` | `+0.5` | `+3` | `-1` | `+Infinity` | `-Infinity` | `NaN` |
| **`-1`** | `-1` | `-1` | `+0` | `-2` | `-0.5` | `-1.5` | `+1` | `-3` | `+Infinity` | `-Infinity` | `NaN` |
| **`+0.5`** | `+0.5` | `+0.5` | `+1.5` | `-0.5` | `+1` | `+0` | `+2.5` | `-1.5` | `+Infinity` | `-Infinity` | `NaN` |
| **`-0.5`** | `-0.5` | `-0.5` | `+0.5` | `-1.5` | `+0` | `-1` | `+1.5` | `-2.5` | `+Infinity` | `-Infinity` | `NaN` |
| **`+2`** | `+2` | `+2` | `+3` | `+1` | `+2.5` | `+1.5` | `+4` | `+0` | `+Infinity` | `-Infinity` | `NaN` |
| **`-2`** | `-2` | `-2` | `-1` | `-3` | `-1.5` | `-2.5` | `+0` | `-4` | `+Infinity` | `-Infinity` | `NaN` |
| **`+Infinity`** | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `NaN` | `NaN` |
| **`-Infinity`** | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `NaN` | `-Infinity` | `NaN` |
| **`NaN`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

`Infinity + -Infinity`は`NaN`になる。

# `a - b`

| `-` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `+0` | `+0` | `-1` | `+1` | `-0.5` | `+0.5` | `-2` | `+2` | `-Infinity` | `+Infinity` | `NaN` |
| **`-0`** | `-0` | `+0` | `-1` | `+1` | `-0.5` | `+0.5` | `-2` | `+2` | `-Infinity` | `+Infinity` | `NaN` |
| **`+1`** | `+1` | `+1` | `+0` | `+2` | `+0.5` | `+1.5` | `-1` | `+3` | `-Infinity` | `+Infinity` | `NaN` |
| **`-1`** | `-1` | `-1` | `-2` | `+0` | `-1.5` | `-0.5` | `-3` | `+1` | `-Infinity` | `+Infinity` | `NaN` |
| **`+0.5`** | `+0.5` | `+0.5` | `-0.5` | `+1.5` | `+0` | `+1` | `-1.5` | `+2.5` | `-Infinity` | `+Infinity` | `NaN` |
| **`-0.5`** | `-0.5` | `-0.5` | `-1.5` | `+0.5` | `-1` | `+0` | `-2.5` | `+1.5` | `-Infinity` | `+Infinity` | `NaN` |
| **`+2`** | `+2` | `+2` | `+1` | `+3` | `+1.5` | `+2.5` | `+0` | `+4` | `-Infinity` | `+Infinity` | `NaN` |
| **`-2`** | `-2` | `-2` | `-3` | `-1` | `-2.5` | `-1.5` | `-4` | `+0` | `-Infinity` | `+Infinity` | `NaN` |
| **`+Infinity`** | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `+Infinity` | `NaN` | `+Infinity` | `NaN` |
| **`-Infinity`** | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `-Infinity` | `NaN` | `NaN` |
| **`NaN`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

# `a * b`

| `*` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `NaN` | `NaN` | `NaN` |
| **`-0`** | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `NaN` | `NaN` | `NaN` |
| **`+1`** | `+0` | `-0` | `+1` | `-1` | `+0.5` | `-0.5` | `+2` | `-2` | `+Infinity` | `-Infinity` | `NaN` |
| **`-1`** | `-0` | `+0` | `-1` | `+1` | `-0.5` | `+0.5` | `-2` | `+2` | `-Infinity` | `+Infinity` | `NaN` |
| **`+0.5`** | `+0` | `-0` | `+0.5` | `-0.5` | `+0.25` | `-0.25` | `+1` | `-1` | `+Infinity` | `-Infinity` | `NaN` |
| **`-0.5`** | `-0` | `+0` | `-0.5` | `+0.5` | `-0.25` | `+0.25` | `-1` | `+1` | `-Infinity` | `+Infinity` | `NaN` |
| **`+2`** | `+0` | `-0` | `+2` | `-2` | `+1` | `-1` | `+4` | `-4` | `+Infinity` | `-Infinity` | `NaN` |
| **`-2`** | `-0` | `+0` | `-2` | `+2` | `-1` | `+1` | `-4` | `+4` | `-Infinity` | `+Infinity` | `NaN` |
| **`+Infinity`** | `NaN` | `NaN` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `NaN` |
| **`-Infinity`** | `NaN` | `NaN` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `NaN` |
| **`NaN`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

`Infinity * 0`は`NaN`になる。

# `a / b`

| `/` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `NaN` | `NaN` | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `NaN` |
| **`-0`** | `NaN` | `NaN` | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `-0` | `+0` | `NaN` |
| **`+1`** | `+Infinity` | `-Infinity` | `+1` | `-1` | `+2` | `-2` | `+0.5` | `-0.5` | `+0` | `-0` | `NaN` |
| **`-1`** | `-Infinity` | `+Infinity` | `-1` | `+1` | `-2` | `+2` | `-0.5` | `+0.5` | `-0` | `+0` | `NaN` |
| **`+0.5`** | `+Infinity` | `-Infinity` | `+0.5` | `-0.5` | `+1` | `-1` | `+0.25` | `-0.25` | `+0` | `-0` | `NaN` |
| **`-0.5`** | `-Infinity` | `+Infinity` | `-0.5` | `+0.5` | `-1` | `+1` | `-0.25` | `+0.25` | `-0` | `+0` | `NaN` |
| **`+2`** | `+Infinity` | `-Infinity` | `+2` | `-2` | `+4` | `-4` | `+1` | `-1` | `+0` | `-0` | `NaN` |
| **`-2`** | `-Infinity` | `+Infinity` | `-2` | `+2` | `-4` | `+4` | `-1` | `+1` | `-0` | `+0` | `NaN` |
| **`+Infinity`** | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `NaN` | `NaN` | `NaN` |
| **`-Infinity`** | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `-Infinity` | `+Infinity` | `NaN` | `NaN` | `NaN` |
| **`NaN`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

`0 / 0`や`Infinity / Infinity`は`NaN`になる。


# `a % b`

| `%` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `NaN` | `NaN` | `+0` | `+0` | `+0` | `+0` | `+0` | `+0` | `+0` | `+0` | `NaN` |
| **`-0`** | `NaN` | `NaN` | `-0` | `-0` | `-0` | `-0` | `-0` | `-0` | `-0` | `-0` | `NaN` |
| **`+1`** | `NaN` | `NaN` | `+0` | `+0` | `+0` | `+0` | `+1` | `+1` | `+1` | `+1` | `NaN` |
| **`-1`** | `NaN` | `NaN` | `-0` | `-0` | `-0` | `-0` | `-1` | `-1` | `-1` | `-1` | `NaN` |
| **`+0.5`** | `NaN` | `NaN` | `+0.5` | `+0.5` | `+0` | `+0` | `+0.5` | `+0.5` | `+0.5` | `+0.5` | `NaN` |
| **`-0.5`** | `NaN` | `NaN` | `-0.5` | `-0.5` | `-0` | `-0` | `-0.5` | `-0.5` | `-0.5` | `-0.5` | `NaN` |
| **`+2`** | `NaN` | `NaN` | `+0` | `+0` | `+0` | `+0` | `+0` | `+0` | `+2` | `+2` | `NaN` |
| **`-2`** | `NaN` | `NaN` | `-0` | `-0` | `-0` | `-0` | `-0` | `-0` | `-2` | `-2` | `NaN` |
| **`+Infinity`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |
| **`-Infinity`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |
| **`NaN`** | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

有限値の`a`に対し、`a % Infinity`は`a`になる。

# `a ** b`

| `**` | **`+0`** | **`-0`** | **`+1`** | **`-1`** | **`+0.5`** | **`-0.5`** | **`+2`** | **`-2`** | **`+Infinity`** | **`-Infinity`** | **`NaN`** |
| :---: |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |  :---:  |
| **`+0`** | `+1` | `+1` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `NaN` |
| **`-0`** | `+1` | `+1` | `-0` | `-Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `NaN` |
| **`+1`** | `+1` | `+1` | `+1` | `+1` | `+1` | `+1` | `+1` | `+1` | `NaN` | `NaN` | `NaN` |
| **`-1`** | `+1` | `+1` | `-1` | `-1` | `NaN` | `NaN` | `+1` | `+1` | `NaN` | `NaN` | `NaN` |
| **`+0.5`** | `+1` | `+1` | `+0.5` | `+2` | `+0.7071067811865476` | `+1.414213562373095` | `+0.25` | `+4` | `+0` | `+Infinity` | `NaN` |
| **`-0.5`** | `+1` | `+1` | `-0.5` | `-2` | `NaN` | `NaN` | `+0.25` | `+4` | `+0` | `+Infinity` | `NaN` |
| **`+2`** | `+1` | `+1` | `+2` | `+0.5` | `+1.4142135623730951` | `+0.7071067811865475` | `+4` | `+0.25` | `+Infinity` | `+0` | `NaN` |
| **`-2`** | `+1` | `+1` | `-2` | `-0.5` | `NaN` | `NaN` | `+4` | `+0.25` | `+Infinity` | `+0` | `NaN` |
| **`+Infinity`** | `+1` | `+1` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `NaN` |
| **`-Infinity`** | `+1` | `+1` | `-Infinity` | `-0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `+Infinity` | `+0` | `NaN` |
| **`NaN`** | `+1` | `+1` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` | `NaN` |

`NaN ** 0`が`1`に、`1 ** Infinity`が`NaN`になる。これは`Math.pow(a, b)`と同じ。

(libcの`math.h`の`pow(NAN, 0)`でも`1`。しかし、libcでは`pow(1, NAN)`や`pow(1, INFINITY)`も`1`になる。)

- https://linux.die.net/man/3/pow


# 生成コード

```js:bin-ops.js
const values = [+0, -0, +1, -1, +0.5, -0.5, +2, -2, Infinity, -Infinity, NaN];

const table = binOp => values.map(left => values.map(right => binOp(left, right)));
const toS = v => {
  if (Math.sign(v) === 1) return `\`+${v}\``;
  if (Math.sign(v) === -1) return `\`${v}\``;
  if (Object.is(v, +0)) return "`+0`";
  if (Object.is(v, -0)) return "`-0`";
  return `\`${v}\``;
}
const print = (table, op = " ") => {
  const head = `| \`${op}\` | ${values.map(v => `**${toS(v)}**`).join(" | ")} |`;
  const sep = `| :---: | ${values.map(v => " :---: ").join(" | ")} |`;
  const lines = table.map((line, i) => `| **${toS(values[i])}** | ${line.map(toS).join(" | ")} |`);
  return [head, sep, ...lines].join("\n") + "\n";
};

console.log(print(table((a, b) => a + b), "+"));
console.log(print(table((a, b) => a - b), "-"));
console.log(print(table((a, b) => a * b), "*"));
console.log(print(table((a, b) => a / b), "/"));
console.log(print(table((a, b) => a % b), "%"));
console.log(print(table((a, b) => a ** b), "**"));
```