2

Matlab にはいらいらする特性があるようです。ステートメントの 2 つの結果が異なる理由がわかりません。変数を暗黙的に宣言すると double 型になるという知識は、理解するのに役立ちません。誰かがそれらの違いを説明できますか? これがコードです。

K>> m = int16(2799)

m =

   2799

K>> n = int16(2800)

n =

   2800

K>> int16( 0.5 * abs(n - m) - 0.5)

ans =

      1

K>> int16 ( 0.5 * abs(2799 - 2800) - 0.5)

ans =

      0

K>> 
4

1 に答える 1

3

その理由は int16 演算です: abs(n - m) は、int16 が与えられているため、int16 を返します。結果は 1 です。乗算も int16 を返します。したがって、0.5 * 1 は 1 に等しくなります (0.5 以上の端数は切り上げられます)。

次に、次のようになります: int16(1 - 0.5) これもまた 1 です。

他のステートメントでは、すべての変数が double 型です。

int16(0.5 * abs(2799 - 2800) - 0.5)
int16(0.5 * 1 - 0.5)
int16(0.5 - 0.5)
int16(0)

では、x が int クラスの場合、MATLAB はなぜ 0.5 * x を整数乗算として計算するのでしょうか? 私には手がかりがありません :-/ しかし、私は MATLAB で整数に問題があり、そのためにそれらを避ける傾向があります。


ドキュメントにそう書かれているので、乗算は整数で行われます。これは C ライクな言語とは逆ですが (int * double は double になります)、間違いではありません。そして(少なくとも)適切に定義され、文書化されています。

于 2013-09-29T13:14:24.780 に答える