代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

如何在Matlab中识别溢出错误?

  •  17
  • Benjamin Oakes  · 技术社区  · 15 年前

    我昨天和今天花了一部分时间在一些Matlab代码中查找一个bug。我原以为我的问题是索引(有许多结构,我没有定义,仍在习惯),但结果却是一个溢出错误。我错过这个是因为一个非常具体的原因:

    >> uint8(2) - uint8(1)
    
    ans =
    
        1
    
    >> uint8(2) - uint8(2)
    
    ans =
    
        0
    
    >> uint8(2) - uint8(3)
    
    ans =
    
        0
    

    我本以为最后一个会是 -1 (或) 255 )在一个大向量的中间,错误的 0 很难发现,但是 二百五十五 很容易脱颖而出。

    有什么建议可以帮助你在将来轻松发现这些问题吗?(理想情况下,我希望关闭溢出检查,使其像c一样工作)更改为 double 当然可以,但如果我不知道 uint8 首先,这没有帮助。

    3 回复  |  直到 13 年前
        1
  •  13
  •   neuroguy123    15 年前

    首先可以打开整数警告:

    intwarning('on')
    

    当整数运算溢出时,这将给您一个警告。

    不过,请注意,如前所述 here ,这会减慢整数运算速度,因此仅在调试期间使用。

        2
  •  6
  •   gnovice    13 年前

    从r2010b版及更高版本开始,函数 INTWARNING has been removed 连同 these warning messages for integer math and conversion :

    • MATLAB:intConvertNaN
    • MATLAB:intConvertNonIntVal
    • MATLAB:intConvertOverflow
    • MATLAB:intMathOverflow

    因此,使用intwarning不再是确定何时发生整数溢出的可行选项。另一种方法是使用 CLASS 函数来测试数据的类,并在执行操作之前相应地重铸它。下面是一个例子:

    if strcmp(class(data),'uint8')  %# Check if data is a uint8
      data = double(data);          %# Convert data to a double
    end
    

    你也可以使用 ISA 功能也:

    if ~isa(data,'single')  %# Check if data is not a single
      data = single(data);  %# Convert data to a single
    end
    
        3
  •  1
  •   yuk    15 年前

    请参阅intwarning函数以控制整数操作的警告。

    http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html