0

Edit3: 実際の答え。

2 つの間違った仮定により、疑問が生じます。

a) 浮動小数点数の暗黙のキャストは float ではなく double です。これにより、2 つの操作の違いが説明されます。

b) デバッガーを信頼しないでください。Servy によって指摘されたように (スティックで少し突き刺した後)、デバッガーは ToString() を使用します。これは、明らかに暗黙の丸めを行うと言われています。2 進数で正確に表現できない浮動小数点値は、丸められて表示されます。これについて議論する人もいるかもしれませんが、私はそれが悪だと主張します。

Edit2:受け入れられたdupe: C#でfloatをintにキャストするときの奇妙な動作

ありがとうノロナー。残りの人は、投稿する前に実際の質問を読む必要があります。

編集:これは実際には重複ではありません。実際、重複の疑いに対する答えは、単に私が混乱している理由を指摘しているだけです...もっと明確にする必要があると思います...

質問は、

a) (61.1 * 10) が (61.1f * 10) と異なる結果をもたらすのはなぜですか [コンパイラの最適化がここで役割を果たすと仮定]?

b) 以下の例の 2 行目がデバッガー出力や出力などで「621.0」と表示されるのはなぜですか? int にキャストした後に明らかなように、実際には 620.9~ に近いのに? [VSデバッガーの「ウォッチ」機能がここでフォーマットマジックを行うと仮定]

わかりましたので、これはもうあまり頻繁には起こりませんが、単純なことのように見えることについてここで根本的に混乱しています (フロートとキャストが単純なものであると仮定すると、そこに私の問題があります..)

つまり、フロートの仕組みを知っています。しかし、これは精度の限界にはほど遠いものであり、おそらく重要ではない操作ですか?

コンパイラの最適化は、異なる結果をもたらすタイトルの 2 つのケースに関係していると推測できますが、実際のケースは実行時です。

float x = 62.1
x*10 // == 621.0
(int)(x*10) // == 620

示されている 621.0 は実際には 620.9999999999999999999999999999998 のようなものであり、キャスト後に切り捨てられると仮定するのは正しいですか?

この場合、私はVSの「ウォッチ」機能を責めるべきだと思います..

4

0 に答える 0