75465


行列の要素？成分？ってNaNでもいいんですか？  
DOMMatrixの、コンストラクタに数値としてパースできない値の配列を渡す、またはメソッドに数値としてパースできない値を渡すと、  
エラーになるかと思ったら受け入れられてNaNを含む結果が返ってきたのですが、これは当たり前のことですか？  
NaNであることに意味がある場面ってどういうときですか？

[code]

    new DOMMatrix(new Array(6))
    //a: NaN
    //b: NaN
    //c: NaN
    //d: NaN
    //e: NaN
    //f: NaN
    //m11: NaN
    //m12: NaN
    //m21: NaN
    //m22: NaN
    //m41: NaN
    //m42: NaN
    
[/code]

[code]

    new DOMMatrix().scale('a')
    //a: NaN
    //b: NaN
    //c: NaN
    //d: NaN
    //m11: NaN
    //m12: NaN
    //m13: NaN
    //m14: NaN
    //m21: NaN
    //m22: NaN
    //m23: NaN
    //m24: NaN
    
[/code]

[code]

    new DOMMatrix().translate('a')
    //e: NaN
    //f: NaN
    //m41: NaN
    //m42: NaN
    //m43: NaN
    //m44: NaN
    
[/code]


CC BY-SA 4.0
2021-04-22T23:35:09.690
75456
2021-04-23T03:23:51.673
2021-04-23T01:32:42.020
30127
30127
question
javascript 数学 行列
行列の要素？成分？のNaNの用途はナンですか


文字通り「パースできなかった」という意味があるでしょう（大マジ）

`NaN` は普通には `0/0` のように未定義の演算結果を意味しています。演算途中で `NaN`
が得られた＝アルゴリズムかプログラムかデータか、何かが誤っていて以後の演算に意味がないことを表現しているわけです。この例題の場合、元データにそもそも意味がないので計算するだけ無駄だから
`NaN` にしているのでしょう。

データーベースの世界だとデータ欠損にもちゃんと意味があって「無いこと」を `NULL` として表現するところだけど、数値演算の世界に `NULL` はないし
`0` にするのはもっと誤っているしってことで `NaN` のほうが安全

プログラム自体のエラーは即停止してデバッガがいればデバッガでトラップされるほうがデバッグがはかどるのでしょうが、データの誤りはプログラムの誤りではないので、正しく「計算結果が無意味であること」が得られるほうが良いという判断なのでしょう。
[javascript](/questions/tagged/javascript "'javascript' のタグが付いた質問を表示") は末端顧客の
Web UA 上で実行されるので、閲覧者は「実行エラー」になっても何をどうしてよいかわからないです。何も出ないほうがまだまし。


CC BY-SA 4.0
2021-04-23T01:32:30.253
75460
2021-04-23T01:32:30.253
8589
75456
answer


検索して資料を辿っていっただけですが、おそらく以下のようなことで、仕様だと思われます。

[DOMMatrix (WebKitCSSMatrix)](https://developer.mozilla.org/en-
US/docs/Web/API/DOMMatrix)

`NaN`が明記されているのは以下のメソッドだけですが、一応要素の取り得る値としては有効なのかもしれません。

> DOMMatrix.invertSelf()  
>  Modifies the matrix by inverting it. If the matrix can't be inverted, its
> components are all set to NaN, and is2D returns false.

例外通知が明記されているのは以下の2つです。

> fromFloat32Array()  
>  Creates a new mutable DOMMatrix object given an array of single-precision
> (32-bit) floating-point values. If the array has six values, the result is a
> 2D matrix; if the array has 16 values, the result is a 3D matrix. Otherwise,
> a TypeError exception is thrown.

> fromFloat64Array()  
>  Creates a new mutable DOMMatrix object given an array of double-precision
> (64-bit) floating-point values. If the array has six values, the result is a
> 2D matrix; if the array has 16 values, the result is a 3D matrix. Otherwise,
> a TypeError exception is thrown.

[DOMMatrix()](https://developer.mozilla.org/en-
US/docs/Web/API/DOMMatrix/DOMMatrix)

言わずもがななのかもしれませんが、新しいオブジェクトを返すとだけあって、例外やエラーには言及されていません。

> The DOMMatrix constructor creates a new DOMMatrix object which represents
> 4x4 matrices, suitable for 2D and 3D operations..

> Parameters  
>  init Optional  
>  A string containing a sequence of numbers or an array of numbers specifying
> the matrix you want to create, or a CSS transform string.

* * *

「類似」と言うか「こじつけられるかも？」という記事

[なぜJavaScriptのDateコンストラクタは例外を投げないのか](https://qiita.com/uhyo/items/4cef6d0b52ffd20c1af4)

> Q. なぜJavaScriptのDateコンストラクタは例外を投げないのか？  
>  A. NaNがあるから

[parseInt()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)

> また、下記の場合は NaN が返されます。
>
>   * radix が 2 よりも小さいか 36 よりも大きい、または r
>   * 最初のホワイトスペース以外の文字が数値に変換できない。
>

[parseFloat()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)

> または、最初のホワイトスペース以外の文字が数値に変換できなかった場合は NaN です。

* * *

上記DOMMatrixコンストラクタのページに仕様の基となったのがこちら、という記述が有り初期化の仕様が記述されています。  
ただしまだDraft状態ですね。  
[Geometry Interfaces Module Level 1](https://drafts.fxtf.org/geometry/)

> Editor’s Draft, 17 February 2021

そしておそらく、以下の記述が要素にNaNを許容する根拠になっているのでは？

[Document conventions](https://drafts.fxtf.org/geometry/#conventions)

> The **NaN-safe minimum** of a non-empty list of unrestricted double values
> is NaN if any member of the list is NaN, or the minimum of the list
> otherwise.

> Analogously, the **NaN-safe maximum** of a non-empty list of unrestricted
> double values is NaN if any member of the list is NaN, or the maximum of the
> list otherwise.

こちらがDOMMatrixの初期化処理と思われます。  
(それ以後も続いているので別のことかもしれませんが)

[6.1. DOMMatrix2DInit and DOMMatrixInit
dictionaries](https://drafts.fxtf.org/geometry/#dommatrixinit-dictionary)

> To **validate and fixup (2D)** a DOMMatrix2DInit or DOMMatrixInit dictionary
> dict, run the following steps:  
>  1 If if at least one of the following conditions are true for dict, then
> throw a TypeError exception and abort these steps.
>
>   * a and m11 are both present and SameValueZero(a, m11) is false.
>   * b and m12 are both present and SameValueZero(b, m12) is false.
>   * ...以下省略
>

>

>> Note: The SameValueZero comparison algorithm returns true for two NaN
values, and also for 0 and -0. [ECMA-262]

`a`から`f`と`m11`から`m42`のそれぞれ両方が`NaN`ならば`true`なので例外は発生しないのでしょう。

ただし文字列化する時に`m11`から`m44`のどれかが`NaN`の場合は例外になるようです。

> stringification behavior  
>  If one or more of m11 element through m44 element are a non-finite value,
> then throw an "InvalidStateError" DOMException.
>

>> Note: The CSS syntax cannot represent NaN or Infinity values.

>

>> EXAMPLE 6  
>  This example will throw an exception because there are non-finite values in
> the matrix.
[code]

>>     var matrix = new DOMMatrix([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]);

>>     var string = matrix + " Batman!";

>>  
[/code]

上記`EXAMPLE 6`が`stringification`時に例外が発生するという例ならば、コンストラクターでは例外は発生しないということなのでしょう。


CC BY-SA 4.0
2021-04-23T02:38:10.370
75465
2021-04-23T03:23:51.673
2021-04-23T03:23:51.673
26370
26370
75456
answer