2013-09-29 74 views
2

Matlab似乎有一个刺激性的特点。我不明白为什么两个陈述的结果是不同的。对变量的隐式声明导致它具有双重类型的知识并不能帮助我理解。有人能解释他们有什么不同吗?这是代码。为什么两个陈述会导致不同的结果?

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>> 

回答

3

原因是INT16算术: ABS(N - M) 返回becaue它被赋予一个INT16 INT16。结果是1. 乘法运算也会返回int16。因此,0.5 * 1等于1.(分数0.5及以上取整)

那么我们有:int16(1 - 0.5)这又是一个。

在其他声明中,所有变量类型的双:

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

现在,为什么MATLAB计算0.5 * x作为当x是类int的整数乘法? 我没有线索: -/ 但是我在MATLAB中遇到了整数问题,并且因此导致避免它们。


好的,乘法是用整数完成的,因为the documentation says so。这与类C语言相反(int * double会产生双精度),但没有错误。并且(至少)它被正确定义和记录。 “

+0

”整数或整数数组和标量双精度浮点数,这会得到与整数操作数具有相同数据类型的结果。“从http://www.mathworks.co.uk/help/matlab/matlab_prog/integers.html#f2-98095 –

+0

谢谢,我总是欣赏官方文档的链接。相应地编辑我的答案。 –

+1

我正在为这个问题写一个答案,但是当我在文档中注意力分散时,你打败了我!奇怪的语义确实如此,我更喜欢C语言。 –

相关问题