問題タブ [iec10967]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
63 に答える
588639 参照

algorithm - 32ビット整数で設定されたビット数を数える方法は?

数値 7 を表す 8 ビットは次のようになります。

3 ビットが設定されます。

32 ビット整数の設定ビット数を決定するアルゴリズムは何ですか?

0 投票する
11 に答える
61579 参照

floating-point - IEEE754 NaN値に対してfalseを返すすべての比較の理由は何ですか?

NaN値の比較が他のすべての値と異なる動作をするのはなぜですか?つまり、一方または両方の値がNaNである演算子==、<=、> =、<、>とのすべての比較は、他のすべての値の動作とは異なり、falseを返します。

これにより数値計算が何らかの形で単純化されると思いますが、他の設計上の決定について詳細に説明しているKahanによるIEEE 754のステータスに関する講義ノートでも、明確に述べられた理由を見つけることができませんでした。

この逸脱した動作は、単純なデータ処理を行うときに問題を引き起こします。たとえば、Cプログラムの実数値フィールドでレコードのリストを並べ替える場合、NaNを最大要素として処理するための追加のコードを記述する必要があります。そうしないと、並べ替えアルゴリズムが混乱する可能性があります。

編集: これまでの答えはすべて、NaNを比較することは無意味であると主張しています。

私は同意しますが、それは正解が間違っていることを意味するのではなく、幸いにも存在しないNot-a-Boolean(NaB)になります。

したがって、比較のためにtrueまたはfalseを返すという選択は、私の見解では恣意的であり、一般的なデータ処理では、データ構造を避けるために、通常の法則(==の再帰性、<、==、>の三分法)に従った場合に有利です。これらの法律に依存しているものは混乱します。

だから私は、哲学的な推論だけでなく、これらの法律を破ることのいくつかの具体的な利点を求めています。

編集2: NaNを最大にすることがなぜ悪い考えであるかを理解したと思います。それは、上限の計算を台無しにするでしょう。

NaN!= NaNは、次のようなループでの収束の検出を回避するために望ましい場合があります。

ただし、これは絶対差を小さな制限と比較することによって記述したほうがよいでしょう。したがって、私見では、これはNaNでの再帰性を破るための比較的弱い議論です。

0 投票する
2 に答える
650 参照

c# - 整数を「大きく」するにはどうすればよいですか?

私は C# の初心者で、Windows フォームで電卓を作成しています。

インターフェイスに 10 桁以上入力すると、これらのデバッグ ブラーブの 1 つが表示されるという問題が発生しました。システムオーバーフロー例外について何か言っていますが、よくわかりません。

Int64誰かが変数を作る簡単な方法を教えてもらえますか?

0 投票する
3 に答える
527 参照

php - 長整数は、切り捨てられずに、短い列に挿入されると変換されます。なんで?式は何ですか?

integer長さ10のタイプの列があります:

この列に長すぎる数値を挿入します。

表にあるものを見ると、番号は次のようになりました。

2147483647

どのように、そしてなぜ715988985123857になったの2147483647ですか?
なぜ切り捨てられなかったのですか?
この変換の背後にあるメカニズムは何ですか?また、結果の数値は何らかの式で計算できますか?


私は解決策を探していません。具体的な数字を理解したいだけです。

0 投票する
1 に答える
711 参照

c - GMP ライブラリの整数の乗算制限

GMP ライブラリの関数を使用してmpz_t、それぞれ の2 つの非常に大きな を乗算しようとしました。2^(10*2^22) bitsmpz_mul

セグメンテーション違反はなく、乗算はなんとか実行されました。ただし、乗算の結果をファイルに出力すると、後続のゼロの文字列だけが観察されました。

この制限を克服する方法はありますか?

0 投票する
1 に答える
753 参照

floating-point - 非論理的であるにもかかわらず、IEEE-754 が NaN != NaN を決定したのはなぜですか?

これは、 IEEE754 NaN 値に対して false を返すすべての比較の根拠は何ですか?へのフォローアップの質問です。(これはコメントよりも別の質問の方が良いと思います)。それはちょうど1つの重要なことを欠いている非常に良い答えを持っています:なぜNaN != NaNですか?

NaN は数値と比較して順序付けされていないためNaN < xNaN > x両方とも常に false であることを理解しています。しかし、それはなぜ平等が後退しているのかを説明していません。私がリンクした質問の答えを引用するには:

次のようなものを提供するプログラミング言語に依存しない NaN 値を検出するための便利で効率的な手段をプログラマーに提供する必要がありました。isNan()

わかりました。

これは便利で効率的で、プログラミング言語が提供する構造に依存しません。プログラミング言語にグローバル NaN が定義されていない場合でも、ローカル (またはグローバル) 変数を自分で簡単に作成できます。

特にFPUにはハードコードされた応答があるため(計算は必要ありません)、単一の余分な操作は確かに非効率的ではありません。0/0 を使用することは、 非論理的 よりもプログラマにとって便利ですx!=x

プログラムが NaN をチェックする必要はめったになく、チェックごとに余分な操作が 1 つあることがプログラムの非効率の理由にはなりません。同様に、単一の余分な変数、特に一時的な変数を処理できないほど抑制されたプログラムはありません。

私にとって、「NaN!=NaN検出できるようにする必要がある」という議論は意味がありませんInfinity!=Infinity。「検出できるようにする必要がある」という議論とまったく同じです。いいえ、他の人と同じように 1/0 と比較してください。

したがって、私の質問は元の質問よりもはるかに狭いです:なぜNaN != NaNですか?

元の質問と重複するものがたくさんあるため、これが以前に尋ねられたかどうかはわかりません。

サイドノート:

NaN == NaN今は変わらない

FPU は現在変更されませんが、一部のプログラミング言語は既に変更されているため、それNaN == NaNは事実です。

編集:

これまでに回答を受け入れなかった理由を明確にさせてください。これまでのコメントを読みましたが、申し訳ありませんが、ボールを落としてしまいました。同意しない理由を説明する代わりに、「なぜ」と尋ねただけで、別の理由を教えてください. それでは、私の見解をよりよく説明してみましょう。

Infinity と NaN は多くの点で似ています。

  1. Infinity と NaN はどちらも概念です。無限は数ではなく、終わりのない概念です。x が Infinity の場合、x が無限であることを表します。NaN は数値ではなく (duh)、無効な状態または数学的に有効でないものを表します。数学的な完全性のために: 無限大は議論の余地のある「数」ですが、浮動小数点数は実数に近似し (有理数に近いですが)、無限大は明らかに実数ではありません。したがって、FPU と実数直線に関する限り、無限大 (すべての型) は数ではありません (ドメインの「数」の定義による)。
  2. 等しいということは、常に数値が等しいというわけではありません。FPU が比較を実行するように要求された場合でも、両方のオペランドが数値 (概念ではない) である場合、一般的な等価性は数値の等価性のみです。一方のオペランドが Infinity または NaN の場合、もう一方が同じ概念を表しているかどうかを確認するために、一般的な等価性が使用されます。たとえば、x == Infinity数値の等価性を使用しません (無限大は数値ではないため) 代わりに、x が正の無限大の概念を表しているかどうかを確認します。同様に、 x が「非数」の概念である場合、まったく同じことがx == NaNtrue を返すことを期待しますが、そうではありません(なぜこの質問のポイントなのか)。
  3. どちらも 0 で割ることで取得できます。0/0 は NaN を返し、1/0 は Infinity を返します。あなたの言語に Infinity の定数がない場合x == (1/0)は、x と Infinity を比較する方法です。
  4. 複数のフレーバー。Infinity には無数の種類があります (カーディナリティのため)。ただし、FPU には区別がありません。Infinity は汎用的なものであり、利用できる唯一のものです。これらの構成では、たとえば x が可算無限大かどうかを尋ねることはできません。NaN には、概念的には 1 つの型しかありませんが (「数ではない」)、2 つの処理方法があります: 静寂とシグナリングです。私はシグナリングについて何も知りませんが、シグナリング NaN の等価性を比較しようとすると、それがスローすることになるため、等価性がないため、完全に話題になっているわけではありません。
  5. ビット表現。NaN にはさまざまなビット表現がありますが、Infinity には 1 (-Infinity の場合は 1) しかありません。ただし、NaN のすべての表現は、「非数」という同じ概念を表しているため、論理的にはまったく同じ値です。0x7FF8000000000000 と 0x7FF8000000000001 を区別する必要はありません。これらはまったく同じことを意味し、まったく同じ計算でどちらの結果も返すことができます。x が sqrt(-1) なのか、それとも x が log(-1) なのかを尋ねることはできません。どちらもまったく同じ NaN を返すからです。Infinity が 1 種類しかないのと同様に、(静かな) NaN も 1 種類しかありません。はい、複数のビット表現がありますが、1 つが他の表現よりも大きくはありません。FPU は特別なロジックを使用して、それらをすべてまったく同じように扱います。これは、+0 とは異なるビットを持つがまったく同じように扱われる -0 にも同様に当てはまります。したがって、ビットは論理的等価性とは関係のない実装の詳細です。
  6. (トピック外ですが、どちらも特別な数学を持っています: x-1Infinity または NaN の値を変更しません)。

はい、あなたが「平等は数字ではないので意味がない」と言ったのを聞いたことがありますが、それが本当なら#1のように無限大を比較するのも意味がないので、その声明には同意しません(これも数字ではありません)。#2のように、非数値を比較することは理にかなっていますが。

実際、元の質問に対するすべての回答を読みました (および、NaN とは異なり、なぜ浮動小数点の無限大は等しいのですか?には関連する回答がいくつかあります)。真である理由のすべての引数は、NaN != NaN「数字ではないため」(既に対処済み) または「さまざまなビット表現が多数あるため」のいずれかに要約されますが、これは #5 によって反論されます。

NaN が異なる等式を持つ必要がある理由の論理的根拠は考えられません。すべてを説明したと言っているわけではありません。私の主張の 1 つが間違っているのでしょうか、それとも私が考えもしなかった別の理由があるのでしょうか? だからこそ、私は「なぜ」という言葉にキャンプを張ってきました。同意しない場合は、私に反論するか、あなたの主張を弁護してください。上記の論理に対して少なくとも 1 つの反論があると思いますが、それを聞くのを楽しみにしています。

ずっと考えていたので、元の質問にこれらを含めなかったことをもう一度お詫びします。また、これにより既存の回答が大きく変わる可能性があることも申し訳ありません。

0 投票する
3 に答える
346 参照

binary - 0 の数が 1 の数と等しい最初の位置を見つけるためのビットトリック

32 ビットまたは 64 ビットの符号なし整数があるとします。

左端 i ビットの 0 の数が左端 i ビットの 1 の数と等しくなるように、左端ビットのインデックス i を見つける最速の方法は何ですか? ここで述べたようなちょっとしたトリックを考えていました。

最近の x86_64 プロセッサに興味があります。これは、POPCNT (1 の数をカウントする) または LZCNT (先頭の 0 の数をカウントする) などの一部のプロセッサ サポート命令に関連している可能性があります。

それが役立つ場合は、最初のビットが常に特定の値を持っていると仮定することができます。

例 (16 ビットの場合): 整数が

i=10 で、マークされた位置に対応します。

16 ビット整数の可能な (遅い) 実装は次のようになります。

編集: @njuffa コメントに従ってコードのバグを修正しました。