Negative Zero

Originally published by Howdy Pierce on November 17th 2017 6,483 reads
Howdy Pierce Hacker Noonプロフィール画像

@howdypiercehowdyピアース

会長兼創設者

facebookのソーシャルアイコンtwitterのソーシャルアイコン

私の妻は、彼女が私が賢明だという点を作りたいと思っているときはいつでも次の話を持ち出す:私の娘の一人が二年生になったとき、彼女の数学の先生は、彼女の数学の先生に語った。任意の数をゼロで割ったクラスは一つでした。 私は結果が未定義でなければならなかったと主張し、先生に情熱的な電子メールを打ち砕きました。 おそらく、これは私が周りにいるのが難しいことがあるという証拠です。冗談は私にあるかもしれませんが、二年生の先生の答えをサポートするのはまだ難しいです。

私は最近、浮動小数点数学について知らなかったことをたくさん学びました:

  • 負のゼロの値があり、通常の(正の?)ゼロ。 これらの2つのゼロは互いに等しいように定義されていますが、それらは別個の値です。
  • x÷0.0、x≤±0の場合。0は、エラーではありません。 代わりに、結果は通常の符号の規則に従って、正の無限大または負の無限大のいずれかになります。
  • ±0.0÷±0.0の場合はエラーです(具体的には「数値ではない」またはNaNです)。
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, そして、-0.0×0.0=-0.0

これらのルールは、プラットフォーム間で浮動小数点表現を標準化したIEEE754″浮動小数点算術標準”に由来しています。 標準の最新バージョンは2008年に完成しましたが、元のバージョンは1985年に発行されたため、この動作は新しいものではありません。 上記のルールは、私のMacのC(gcc)とSwiftの両方に当てはまり、iPhoneのSwiftにも当てはまります。 Mac上のPythonは浮動小数点数の負のゼロをサポートしていますが、任意の符号のゼロで除算しようとすると例外がスローされます。0.0と-0.0は等しいと比較しなければならないため、test(x<0。0)すべての負の数に対してtrueを返しません—負のゼロの場合は失敗します。 したがって、ゼロ値の符号を決定するには、プラットフォームの組み込みの符号関数、たとえばDoubleを使用する必要があります。Swiftにサインインします。 または、doubleの生の表現をビット操作することができると思いますが、これは非常にCプログラマの答えです。

  • a=b÷cの場合、必ずしもb=a×cに従うとは限りません。cがいずれかの符号のゼロである場合でも失敗するためです。
  • a=b÷cの場合、b=a×c私は数論者ではありませんが、上記の概念は驚くべきことです。一つの即時の問題

    : 無限大はゼロや3.25やπのような数ではありません。 むしろ、無限は概念です。 有理数は可算無限大であることは事実です—しかし、無限大は有理数の集合のメンバーではありません。さらに、数論の観点からは、ゼロによる除算は無意味です。

    さらに、数論の観点からは、ゼロによる除算は無意味です。

    分割の意味を正確に理解すれば、理由を理解できます。 技術的には、「除算」は「数の逆数による乗算」であり、逆数は次を満たす:a×a^-1=1。 ゼロは、単純に乗法逆数を持たない実数の集合の唯一の数です。 そして、この逆数は存在しないので、それを乗算することはできません。しかし、浮動小数点数を設計した人々は確かにこれをすべて知っていました。 だから、私は説明された動作がIEEE標準に書かれるようになった理由について疑問に思っていました。

    まず、浮動小数点演算が対処しようとしている問題を考えてみましょう。 実数は無限大ですが、この集合全体を有限のコンピュータメモリの範囲内で表現したいと考えています。 64ビットのdoubleでは、2^64の可能なシンボルがあり、IEEE標準の設計者は、実世界のアプリケーションに有用であり、80年代初頭のシリコンの制約を考慮して経済的に実現可能な方法で、これらのシンボルを実数の集合にマッピングしようとしていました。 基本的な要件を考えると、明らかに近似が使用されることになっていました。

    負のゼロの推論は、”浮動小数点の父”とみなされ、後にIEEE754の起草における彼の仕事のためにチューリング賞を受賞したバークレーの教授であるWilliam Kahanによる1987年の論文にまで遡るようである。 負のゼロの存在は、ゼロで除算する能力に密接に結びついていることが判明しました。ゼロによる除算が許可されていないという通常の理由について議論することから始めましょう。

    ゼロによる除算へのナイーブなアプローチは、

    言い換えれば、xが小さくなるにつれて、1/xの結果が大きくなります。

    つまり、xが小さくなると、1/xの結果が大きくなります。

    つまり、xが小さくなります。 しかし、これはxが正の側から0に近づくときにのみ当てはまります(そのため、上に小さなプラス記号があります)。 否定的な側面から同じ思考実験を実行する:

    その結果、関数1/xに不連続(kahanがスリットと呼ぶもの)があるため、xが0に近づくにつれて1/xの一般的な限界は未定義です。

    しかし、署名されたゼロ、kahanとieee委員会は、この困難を回避することができます。 直感的には、ゼロの符号は、限界が近づいている方向を示すために取られます。 カハンは彼の1987年の論文で述べているように:

    +0と-0を別個の数値と考えるのではなく、符号ビットを、値として0を取る数値変数に関する情報(または誤った情報)を伝える補助変数と考 通常、この情報は無関係です。3+xの値は、x:=+0の場合とx:=-0の場合と違いはありません…。 しかし、いくつかの特別な算術演算は、ゼロの符号の影響を受けます。

    私は私のパートナー Mike Perkinsによって提案された合理化を採用することによって概念と私の平和を作った:2^64利用可能なシンボルは、実数のセッ だから、IEEEの設計者は、特別な意味のためにこれらのシンボルのいくつかを取っておきます。 この意味で、∞は実際には「無限大」を意味するのではなく、「浮動小数点シンボルセットで表現できるよりも大きい実数」を意味します。 したがって、+0は実際には「ゼロ」を意味するのではなく、「真の0よりも大きいが、表現できる任意の正の数よりも小さい実数」を意味します。”

    ちなみに、この問題を研究している間、私はKahanでさえ負のゼロのアイデアを愛していないことを発見しました。

    Signed zero—まあ、符号付きゼロは、射影モードを使用した場合に排除できるお尻の痛みでした。 あなたはゼロの符号を気にしませんでしたし、無限の符号を気にしませんでした。 しかし、一方で、あなたが私が2つの無限大のより低い選択とみなしたものを主張したならば、あなたは2つの符号付きゼロで終わるでしょう。 本当にそれを回避する方法はありませんでしたし、あなたはそれで立ち往生していました。”(2005年に行われたKahanのインタビューから。)

    十年後にブログ記事を書くことが貧しい二年生の先生に対する手すりを補うかどうかはわかりません。 彼女の部分のために私の娘は、今高校で、ちょうど私が夕食でゼロによる分割について話し始めたときに彼女の目を転がしました。 だから、多分その”周りにいるのは難しい”ことは遺伝性です。Kahan,W.,”複雑な基本関数の分岐カット,または何の符号ビットについての多くの騒ぎ”,数値解析における最先端,(Eds. IserlesおよびPowell)、Clarendon Press、Oxford、1 9 8 7年、ここで入手可能である。

    Tags

    Join Hacker Noon

    Create your free あなたのカスタム読書体験のロックを解除するためのアカウン

    div

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です