12

明確にするために、私はNaNや無限大を探したり、答えを尋ねたりしていx/0ません。私が探しているのはこれです:

ハードウェアで除算がどのように実行されるか(どのように実行されるかはわかりません)に基づいて、除数が0で除算が実行され、プロセッサが操作をうまく実行した場合、何が発生しますか?

これは配当に大きく依存していることを理解しているので、具体的な答えとして、次のように質問します。コンピュータが標準の除算演算に従った場合、コンピュータは何を吐き出し42 / 0ますか?

アップデート:

もう少し明確にしようと思います。解決策に到達するためにビットレベルの数値で行われる実際の操作について質問しています。操作の結果はほんの少しです。除数がゼロであることが検出されると、NaNとエラー/例外が発生します。分割が実際に起こった場合、どのビットが出てくるでしょうか?

4

8 に答える 8

12

止まらないかもしれません。整数の除算は、減算を繰り返すことで線形時間で実行できます。7/2の場合、7から2を合計3回減算できるため、これが商であり、余り(モジュラス)は1です。そのようなアルゴリズムに0を与えると、それを防ぐメカニズムがない限り、アルゴリズムは停止しません。42から0を、どこにも行かなくても無限に引くことができます。

タイプの観点から、これは直感的である必要があります。未定義の計算または停止しない計算の結果は⊥(「下」)であり、未定義の値はすべてのタイプに存在します。ゼロによる除算は整数で定義されていないため、エラーを発生させたり、終了に失敗したりして、⊥を正しく生成する必要があります。前者がおそらく好ましいでしょう。;)

他のより効率的な(対数時間)除算アルゴリズムは、商に収束する級数に依存しています。配当が0の場合、私が知る限り、これらは収束に失敗する(つまり、終了に失敗する)か、0を生成します。WikipediaのDivisionを参照してください。

浮動小数点除算も同様に特別な場合が必要です。2つの浮動小数点数を除算するには、指数を減算し、仮数を整数で除算します。同じ基礎となるアルゴリズム、同じ問題。そのため、IEEE-754には、正と負の無限大、および符号付きゼロとNaN(0/0の場合)の表現があります。

于 2011-11-06T23:59:45.920 に答える
8

x86 withなどの内部「除算」命令を持つプロセッサのdiv場合、ゼロで除算しようとすると、CPUは実際にソフトウェア割り込みを引き起こします。このソフトウェア割り込みは通常、言語ランタイムによってキャッチされ、適切な「ゼロ除算」例外に変換されます。

于 2011-11-06T23:59:10.777 に答える
5

ハードウェア除算器は通常、パイプライン化された長い除算構造を使用します。

今のところ整数除算について話していると仮定します(浮動小数点ではなく)。筆算の最初のステップは、最も重要なものを整列させることです(被除数から除数を減算する前に)。明らかに、これは0の場合は定義されていないため、ハードウェアが何をするかは誰にもわかりません。それが何か正気であると仮定した場合、次のステップはlog(n)減算を実行することです(nはビット位置の数です)。正の結果をもたらす減算ごとに、出力ワードに1が設定されます。したがって、このステップからの出力はすべて1の単語になります。

浮動小数点除算には、次の3つのステップが必要です。

  • 指数の差を取る
  • 仮数の固定小数点除算
  • 特殊なケースの処理

0は、すべて0(仮数と指数の両方)で表されます。ただし、仮数には常に暗黙の先頭1が存在するため、この表現を特殊なケースとして扱わなかった場合、2の非常に小さな累乗のように見えて動作します。

于 2011-11-07T00:15:58.663 に答える
2

実装によって異なります。IEE標準754浮動小数点[1]は符号付き無限大値を定義しているため、理論的にはゼロ除算の結果である必要があります。除算演算でデモニネータがゼロの場合、ハードウェアは単にフラグを設定します。それに魔法はありません。

一部の誤った(x86を読み取る)アーキテクチャは、ゼロ除算に達した場合にトラップをスローします。これは、理論的には、数学的な観点からは、警官です。

[1] http://en.wikipedia.org/wiki/IEEE_754-2008

于 2011-11-06T23:59:18.387 に答える
1

無限ループになります。通常、除算は、乗算が連続加算によって行われるのと同じように、連続減算によって行われます。

とにかく答えが何であるかを私たち全員が知っているので、ゼロは特別な場合です。

于 2011-11-06T23:59:27.147 に答える
1

それは実際には例外を吐き出します。数学的には、42/0は未定義であるため、コンピューターはこれらの入力に特定の値を吐き出すことはありません。除算はハードウェアで実行できることは知っていますが、適切に設計されたハードウェアには、結果を含むはずのレジスタに含まれる値が無効であることを通知するための何らかのフラグまたは割り込みがあります。多くのコンピューターはこれから例外を作ります。

于 2011-11-07T00:02:27.510 に答える
1

x86では、割り込み0が発生し、出力レジスタは変更されません。

最小限の16ビットリアルモードの例(たとえば、ブートローダーに追加される):

    movw $handler, 0x00
    movw %cs, 0x02
    mov $0, %ax
    div %ax
    /* After iret, we come here. */
    hlt
handler:
    /* After div, we come here. *
    iret

このコードを詳細に実行する方法|| 32ビットバージョン

DIV命令に関するIntelのドキュメントには、通常の出力レジスタ(ax==結果、dx==モジュール)が変更されるとは記載されていないため、これは変更されないことを意味すると思います。

次に、Linuxはその割り込みを処理して、それを実行したプロセスにSIGFPEを送信します。これにより、処理されない場合は割り込みが強制終了されます。

于 2015-10-21T20:03:08.257 に答える
-1

X / 0ここで、Xは実数の要素であり、1以上であるため、X /0=無限大の答えになります。

除算法(c#)

Int Counter = 0; /* used to keep track of the division */
Int X = 42;      /* number */
Int Y = 0;       /* divisor */
While (x > 0) { 
    X = X - Y; 
    Counter++;
}
Int answer = Counter;
于 2013-12-31T12:27:34.617 に答える