2016-03-16 14 views
5

は、変数を作成し、それが0に値を設定することができます。 1は-1を掛けたい場合:

$x = -1 * $x; 
echo $x; 

我々はまだ0を参照してください。 $xがfloatであるなら:-0

$x = 0; 
$x = (float)$x; 
$x = -1 * $x; 
echo $x; 

我々は出力を得るでしょう。

なぜですか?基になる型に関係なく、常に符号なしで表示されるべきですか?

+4

さらに楽しく、 '$ x = $ x + 0'を試してもう一度印刷してください。本当の理由は、PHP(とコンピュータ、一般的には本当に)は実際にはその正確な値を持つ特定の浮動小数点を表すかどうかではないということです。ゼロを含む。 '-0'は本当に' -0.00000000000003'です。 – CollinD

+2

これから得られる主なことは、浮動小数点で '=='を使うべきではないということです。 – Gasim

+1

dupe? http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

答えて

1

PHPは、典型的に構成された浮動小数点数のためIEEE 754倍精度フォーマットを使用するため:

1)サイン(1ビット)

2)指数(11ビット)

3)分数(52ビット)

$ xに-1を掛けると、符号ビットが設定されます。

整数は、最上位ビット(MSB)が符号を決定する2つの補数を使用します。ゼロがちょうど絶対零度以上のために使用されているhttps://en.wikipedia.org/wiki/Signed_zero

+0

私はこれが質問の「なぜ」の部分に答えるとは思わないのですか?符号の振る舞いを変更する-1による乗算は、NaNには適用されず、ゼロに適用されないように定義されている可能性があります。 –

+0

@PatriciaShanahan:私の答えは、署名されたゼロのユースケースを逃しているが、テクニカルサイドとPHPの実装をカバーすることに同意します。 – Rocki

1

浮動小数点を:あなたは0

を参照してくださいに掛ける場合MSBは0です。これは、異常な数値に対しても絶対値が小さすぎる小さな結果を表すために使用されます。

一部の計算では、そのような数値の符号が重要です。例えば、1/+ 0は正の無限大であるが、1/-0は負の無限大であることが重要である。その作業を正しく行うには、0に-1を掛けると-0が得られます。

たとえば、W. Kahanの論文"Branch Cuts for Complex Elementary Functions or Much Ado About Nothing's Sign Bit"を参照してください。

+0

ええ、PHPではほとんどの場合、突然intが浮動小数点になるときを制御しません。したがって、このような意図しない表示の問題。 – Gacek

+0

@Gacek PHPの型変換のルールは複雑で、時には愚かですが、完全に決定的です。 intが浮動小数点数になると、あなたは「制御する」ことができます。 – Sneftel

関連する問題

 関連する問題