は、変数を作成し、それが0
に値を設定することができます。 1は-1
を掛けたい場合:
$x = -1 * $x;
echo $x;
我々はまだ0
を参照してください。 $x
がfloatであるなら:-0
:
$x = 0;
$x = (float)$x;
$x = -1 * $x;
echo $x;
我々は出力を得るでしょう。
なぜですか?基になる型に関係なく、常に符号なしで表示されるべきですか?
は、変数を作成し、それが0
に値を設定することができます。 1は-1
を掛けたい場合:
$x = -1 * $x;
echo $x;
我々はまだ0
を参照してください。 $x
がfloatであるなら:-0
:
$x = 0;
$x = (float)$x;
$x = -1 * $x;
echo $x;
我々は出力を得るでしょう。
なぜですか?基になる型に関係なく、常に符号なしで表示されるべきですか?
PHPは、典型的に構成された浮動小数点数のためIEEE 754倍精度フォーマットを使用するため:
1)サイン(1ビット)
2)指数(11ビット)
3)分数(52ビット)
$ xに-1を掛けると、符号ビットが設定されます。
整数は、最上位ビット(MSB)が符号を決定する2つの補数を使用します。ゼロがちょうど絶対零度以上のために使用されているhttps://en.wikipedia.org/wiki/Signed_zero
私はこれが質問の「なぜ」の部分に答えるとは思わないのですか?符号の振る舞いを変更する-1による乗算は、NaNには適用されず、ゼロに適用されないように定義されている可能性があります。 –
@PatriciaShanahan:私の答えは、署名されたゼロのユースケースを逃しているが、テクニカルサイドとPHPの実装をカバーすることに同意します。 – Rocki
浮動小数点を:あなたは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"を参照してください。
さらに楽しく、 '$ x = $ x + 0'を試してもう一度印刷してください。本当の理由は、PHP(とコンピュータ、一般的には本当に)は実際にはその正確な値を持つ特定の浮動小数点を表すかどうかではないということです。ゼロを含む。 '-0'は本当に' -0.00000000000003'です。 – CollinD
これから得られる主なことは、浮動小数点で '=='を使うべきではないということです。 – Gasim
dupe? http://stackoverflow.com/questions/588004/is-floating-point-math-broken –