web-dev-qa-db-ja.com

浮動小数点数がゼロに符号を付けているのはなぜですか?

ダブルスに-0+0があるのはなぜですか?背景と意義は何ですか?

74
Ken Russell

_-0_は(一般的に)_0_ *******として扱われます。 負の浮動小数点数がゼロに非常に近く、_0_と見なすことができる場合に発生する可能性があります(明確にするために、私は 算術アンダーフロー 、および次の計算の結果は、正確に_±0_であり、実際には小さい数ではないと解釈されます。例えば.

_System.out.println(-1 / Float.POSITIVE_INFINITY);
_
-0.0 

正の数で同じケースを検討すると、古き良き_0_を受け取ります。

_System.out.println(1 / Float.POSITIVE_INFINITY);
_
 0.0 

******* _-0.0_を使用すると、_0.0_を使用した場合とは異なる結果になる場合があります。

_System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
_
 Infinity 
-Infinity 

これは、関数_1 / x_を検討する場合に意味があります。 x_0_側から_+_に近づくと、次のようになります。 positive無限大ですが、_-_側から近づくと、無限大。関数のグラフはこれを明確にする必要があります:

ソース

数学用語で:

enter image description here

enter image description here

これは、計算の意味での_0_と_-0_の1つの重要な違いを示しています。


ここにいくつかの関連リソースがあり、そのうちのいくつかはすでに取り上げられています。完全を期すためにそれらを含めました:

87
arshajii

ウィキペディアから

符号付きゼロは、関連する符号を持つゼロです。通常の算術では、_−0 = +0 = 0_。コンピューティングでは、いくつかの数値表現に2つのゼロが存在するという概念が存在します。通常は_−0_および '+0'で表され、を表します。負のゼロと_+0_それぞれ正のゼロソース )。

これは、符号と大きさ、および1の補数 符号付き数値表現 整数の場合、およびほとんどの浮動小数点数表現で発生します。数値0は通常+0としてエンコードされますが、+ 0または-0のいずれかで表すことができます。

_IEEE 754 standard_によると、負のゼロと正のゼロは、CやJavaの==演算子など、通常の(数値)比較演算子と等しいと比較する必要があります。 ( ソース )。

浮動小数点演算があり、負の浮動小数点の結果が生成される場合)ゼロに近いが、表現できない(計算では)「-0.0」を生成します。たとえば-_5.0 / Float.POSITIVE_INFINITY -> -0.0_。

この区別は、_-0.0_と_+0.0_で、単に最終結果0を与えるよりも多くの情報を提供します。もちろん、この概念は、コンピューターで使用されるような有限表現システムに「のみ」存在します。 。数学では、ゼロに非常に近い場合でも、任意の数を表すことができます。

_−0_および_+0_は、アンダーフロー、同様の_−00_または_+00_を引き起こす操作の結果です。 オーバーフローを引き起こす操作の結果です。数学的に不確定化を引き起こす操作の場合、結果はNaN(例:0/0)になります。

-0.0と0.0の違いは何ですか?

実際には、両方とも0を表します。さらに、(-0.0 == 0.0)はtrueを返します。それにもかかわらず:

1)_1/-0.0_は-Infinityを生成し、_1/0.0_はInfinityを生成します。

2)3 * (+0) =+ 0および_+0/-3_ =-0符号規則は、符号付きゼロに対して乗算または除算を実行するときに適用されます。

必読 " すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと "(コメントで提案)。

29
dreamcrash

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと の「符号付きゼロ」のセクションを参照してください。

Java floatとdoubleのゼロは、真のゼロを表すだけではありません。正確な結果の大きさが小さすぎて表現できない計算の結果としても使用されます。大きな違いがあります。多くの場合、負の数のアンダーフローと正の数のアンダーフローの間です。たとえば、xが非常に小さい正の数の場合、_1/x_は正の無限大であり、1/(-x)は負の無限大である必要があります。符号付きゼロは、アンダーフロー結果の符号を保持します。

25

浮動小数点での符号付きゼロの有用性に関する標準的な参照は、Kahanの論文 " 複雑な初等関数の分岐点、または何もない符号ビットについての大騒ぎ "(およびこの主題に関する彼の講演の一部)です。

短いバージョンでは、かなり一般的なエンジニアリングアプリケーションでは、数値的方法から正しい解を得るには、ゼロに署名することによって保持される符号情報が必要です。ゼロの符号は、ほとんどのreal操作ではほとんど意味がありませんが、複素数値関数が考慮される場合、または等角写像が使用される場合、ゼロの符号は突然非常に重要になります。

また、元の(1985)IEEE-754委員会が、浮動小数点演算の射影モードをサポートすることを検討し、却下したことも注目に値します。これは、符号なし無限大が1つだけ存在します(このようなモードでは+/- 0は意味的に同一であるため、エンコードが2つある場合でも、ゼロも1つだけ存在します)。

8
Stephen Canon