タグ付けされた質問 「arithmetic」

ハードウェアまたはアルゴリズムを備えたコンピューターでの基本算術演算の実装に関する質問。数値は、多くの場合、バイナリ表現であると見なされます。浮動小数点表現の数値の算術演算には、[floating-point]タグを追加します。

9
なぜ最新のプロセッサでの加算はビット単位の操作と同じくらい速いのですか?
最新のプロセッサではビット単位の操作が非常に高速であることがわかっています。32ビットまたは64ビットを並列で操作できるため、ビット単位の操作には1クロックサイクルしかかかりません。ただし、加算は、少なくとも1つ、場合によっては最大12個のビット単位の操作で構成される複雑な操作であるため、当然、3〜4倍遅くなると考えました。単純なベンチマークの後、ビット単位の演算(XOR、OR、ANDなど)のどれとでも加算が正確に速いことを見て驚いた。誰もこれに光を当てることができますか?

3
素因数乗算よりも効率的な階乗アルゴリズム
繰り返しと再帰の両方を使用して階乗をコーディングする方法を知っています(n * factorial(n-1)たとえば)。教科書を読んで(詳細な説明はありません)、階乗を半分に再帰的に分割することで、階乗をコーディングするさらに効率的な方法があることを読みました。 なぜそうなるのか理解しています。しかし、私は自分でそれをコーディングしてみたかったのですが、どこから始めればいいのかわかりません。友人は、私が最初にベースケースを書くよう提案しました。数値を追跡できるように配列を使用することを考えていましたが、そのようなコードを設計する方法が実際にはわかりません。 どのようなテクニックを研究すべきですか?

6
基数10を経由せずに基数から基数に変換する背後にある数学は?
任意のベースから任意のベースへの変換の背後にある数学を調べてきました。これは、何よりも結果の確認に関するものです。mathforum.orgで私の答えと思われるものを見つけましたが、正しいかどうかはまだわかりません。大規模なベースから小規模なベースへの変換は大丈夫です。なぜなら、最初の桁に次の桁の繰り返しを追加したいだけであるためです。私の問題は、小さなベースから大きなベースに変換するときに発生します。これを行うとき、彼らはあなたがあなたが持っている小さなベースに必要な大きなベースを変換する必要があるかについて話します。たとえば、ベース4からベース6に移動すると、6をベース4に変換して12を取得する必要があります。その後、大から小に変換するときと同じことを行います。私がこれに関して持っている難しさは、あなたが他のベースにある数字が何であるかを知る必要があるようです。したがって、ベース4に6が何であるかを知る必要があります。テーブルが必要になるため、これは私の頭に大きな問題を引き起こします。誰もがこれをより良い方法で行う方法を知っていますか? 基本的な変換が役立つと思いましたが、そのような機能が見つかりません。そして、私が見つけたサイトから、ベース10を経由せずにベースからベースに変換できるようですが、最初にベースからベースに最初の数値を変換する方法を知る必要があります。それはちょっと無意味になります。 コメンターは、文字を数字に変換する必要があると言っています。もしそうなら、私はすでにそれを知っています。しかし、それは私の問題ではありません。私の問題は、大きなベースを小さなベースに変換するために、最初に持っているベース番号を必要なベース番号に変換する必要があることです。これらのベースを他のベースに変換する能力があれば、すでに問題を解決しているので、これを行うことで目的を無効にします。 編集:10以下のベースから10以下の他のベースに変換する方法を考えました。10以上のベースから10以下のベースに移動することもできます。この問題は、10を超えるベースから10を超えるベースに変換するときに開始されます。または、10未満のベースから10を超えるベースに移行すると、コードが不要になります。コードに適用されます。

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

6
GCDにとって最も効率的なものは何ですか?
ユークリッドのアルゴリズムは、正の整数のリストのGCD(最大公約数)を取得するための最適なアルゴリズムであることを知っています。しかし実際には、このアルゴリズムをさまざまな方法でコーディングできます。(私の場合、Javaを使用することにしましたが、C / C ++が別のオプションである可能性があります)。 プログラムで可能な限り最も効率的なコードを使用する必要があります。 再帰モードでは、次のように記述できます。 static long gcd (long a, long b){ a = Math.abs(a); b = Math.abs(b); return (b==0) ? a : gcd(b, a%b); } 反復モードでは、次のようになります。 static long gcd (long a, long b) { long r, i; while(b!=0){ r = a % b; a = b; b = …


4
フロートの不正確さが原因の不平等
少なくともJavaでは、このコードを書くと: float a = 1000.0F; float b = 0.00004F; float c = a + b + b; float d = b + b + a; boolean e = c == d; の値はeeeなり。これは、数値を正確に表現する上でフロートが非常に制限されているという事実が原因であると考えています。しかし、なぜの位置を変えるだけでこの不平等が生じるのか理解できません。falsefalsefalseaaa 以下のように、3行目と4行目の両方で sを1 に減らしましたが、の値はなり。bbbeeetruetruetrue float a = 1000.0F; float b = 0.00004F; float c = a + b; float …


3
加算の時間の複雑さ
ウィキペディアは、加算の時間の複雑さをとしてリストしています。ここで、はビット数です。nnnnnn これは厳密な理論上の下限ですか?または、これは、現在最も高速な既知のアルゴリズムの複雑さだけです。加算が複雑であるため、他のすべての算術演算とそれらを使用するすべてのアルゴリズムが強調されているので、知りたいと思います。 o(n)で実行される追加アルゴリズムを取得することは理論的に不可能o(n)o(n)o(n)ですか?または、追加のために線形の複雑さに拘束されます。

9
精度を失わずに実数を表す
現在の浮動小数点(ANSI C float、double)では、実数の近似値を表すことができます。エラーなしで実数 を表す方法はありますか? ここに私が持っているアイデアがあります、それは完璧ではありません。 たとえば、1/3は0.33333333 ...(base 10)またはo.01010101 ...(base 2)ですが、0.1(base 3)でもあり ます。この「構造」を実装するのは良い考えです。 base, mantissa, exponent したがって、1/3は3 ^ -1になる可能性があります {[11] = base 3, [1.0] mantissa, [-1] exponent} 他のアイデアは?


1
浮動小数点モジュラスの正確さが重要なのはなぜですか?
ほとんどのSmalltalk方言は現在、単純な浮動小数点係数(fmod / remainder)を実装しています。 Squeak / Pharoを改善し、最終的には他のSmalltalkの標準(IEEE 754、ISO / IEC 10967)への準拠を改善するために、これを変更しました。 ただし、これらの変更の採用については、標準に準拠するだけでは同僚を納得させることができないため、この正確さがどのような状況で実際に重要であるかを説明すると、非常に役立ちます。今のところ、自分で良い例を見つけることはできません。 ここで誰かが、なぜ/いつ/どこで(どのアルゴリズムのIOW)そのような係数の正確さが重要になるか知っていますか?

4
論理ゲートを使用して、バイナリ表現を10倍する方法を教えてください。
だから私は現在何かに取り組んでおり、0から9までのすべての10進数を2進数に変換しました。しかし、今私はバイナリで言う6を取り、10に変換せずに10の桁でその桁を増やしたいと思います(6を60に変えます)これは可能ですか? -> X0? 編集1:申し訳ありませんが、質問の最初の部分は非常にあいまいであり、私はこれを論理ゲートで実行しようとしていることを言及するのを忘れていました。

1
XORを使用したバイナリベクトルのセットの最小基底
これが十分に研究された問題ではない場合は驚きますが、この時点で他に何を検索すればよいかわかりません。バイナリベクトルのセット。問題は、最小サイズのバイナリベクトル別のセットを見つけることです、すべてのベクトルは、の一部のサブセットのXOR結果で表現できる(したがって、は基本的に、の追加ではなくXORを使用し、線形結合でバイナリ係数のみを許可する基本です)。んnnS⊂{0,1}nS⊂{0,1}nS \subset \{0,1\}^nnnnB⊂{0,1}nB⊂{0,1}nB \subset \{0,1\}^n|B||B||B|SSSBBBBBBSSS ある意味で、これはバイナリベクトルのPCAの形式です。この問題に関する文献を検索しているときに、この博士論文で議論されている離散基底問題に出くわしました。これは密接に関連しているようです。XORの代わりにORを使用し、ここで追加の入力です(そして、タスクは、からのベクトルでを表す際のエラーを最小限に抑えることです)。この問題はNP困難です。同じことが上記の問題にも当てはまりますか、それとも効率的な解決策はありますか?既存の文献へのポインタがあれば大歓迎です。|B||B||B|SSSBBB

4
(ビット)加算とシフトをプリミティブとして使用して平方根を計算する
質問:ビットの自然数与えられた、(ビット)の加算とシフトのみを使用してを計算する方法は?nnnNNN⌈N−−√⌉⌈N⌉\lceil \sqrt{N} \rceilO(n)O(n)O(n) ヒントは、バイナリ検索を使用することです。しかし、必要な複雑さを実現できませんでした(を取得しました)。O(n2)O(n2)O(n^2) それはどういう意味ですかusing only $O(n)$ (bit) additions and shifts: これはアルゴリズムブックの練習問題です。 私の意見では、それは2を追加し、言うことを意味しビットは、自然数は、コストとシフトする、と言うビットは、自然数もコスト。次に、そのような操作を回しか使用できません。 比較のコストについては触れられていません。私はそれを無視することができると思います、または2つ、たとえばビットの自然数を比較することもを要すると仮定することができます。nnnO(1)O(1)O(1)nnnO(1)O(1)O(1)O(1)O(1)O(1)O(n)O(n)O(n)nnnO(1)O(1)O(1) 私のアルゴリズムO(n2)O(n2)O(n^2): ビットの数の範囲を決定の: したがって、 t_1 \ triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ triangleq t_2。ttt⌈N−−√⌉⌈N⌉\lceil \sqrt{N} \rceil2n−12≤N−−√≤2n2⇒2⌊n−12⌋≤⌈N−−√⌉≤2⌈n2⌉2n−12≤N≤2n2⇒2⌊n−12⌋≤⌈N⌉≤2⌈n2⌉2^{\frac{n-1}{2}} …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.