How do I get real integer overflows in MATLAB/Octave?

后端 未结 6 1603
天涯浪人
天涯浪人 2020-11-28 14:31

I\'m working on a verification-tool for some VHDL-Code in MATLAB/Octave. Therefore I need data types which generate \"real\" overflows:

intmax(\'int32\') + 1         


        
6条回答
  •  [愿得一人]
    2020-11-28 15:02

    In MATLAB, one option you have is to overload the methods that handle arithmetic operations for integer data types, creating your own custom overflow behavior that will result in a "wrap-around" of the integer value. As stated in the documentation:

    You can define or overload your own methods for int* (as you can for any object) by placing the appropriately named method in an @int* folder within a folder on your path. Type help datatypes for the names of the methods you can overload.

    This page of the documentation lists the equivalent methods for the arithmetic operators. The binary addition operation A+B is actually handled by the function plus(A,B). Therefore, you can create a folder called @int32 (placed in another folder on your MATLAB path) and put a function plus.m in there that will be used instead of the built-in method for int32 data types.

    Here's an example of how you could design your overloaded plus function in order to create the overflow/underflow behavior you want:

    function C = plus(A,B)
    %# NOTE: This code sample is designed to work for scalar values of
    %#       the inputs. If one or more of the inputs is non-scalar,
    %#       the code below will need to be vectorized to accommodate,
    %#       and error checking of the input sizes will be needed.
    
      if (A > 0) && (B > (intmax-A))  %# An overflow condition
    
        C = builtin('plus',intmin,...
                    B-(intmax-A)-1);  %# Wraps around to negative
    
      elseif (A < 0) && (B < (intmin-A))  %# An underflow condition
    
        C = builtin('plus',intmax,...
                    B-(intmin-A-1));  %# Wraps around to positive
    
      else
    
        C = builtin('plus',A,B);  %# No problems; call the built-in plus.m
    
      end
    
    end
    

    Notice that I call the built-in plus method (using the BUILTIN function) to perform addition of int32 values that I know will not suffer overflow/underflow problems. If I were to instead perform the integer addition using the operation A+B it would result in a recursive call to my overloaded plus method, which could lead to additional computational overhead or (in the worst-case scenario where the last line was C = A+B;) infinite recursion.

    Here's a test, showing the wrap-around overflow behavior in action:

    >> A = int32(2147483642);  %# A value close to INTMAX
    >> for i = 1:10, A = A+1; disp(A); end
      2147483643
    
      2147483644
    
      2147483645
    
      2147483646
    
      2147483647   %# INTMAX
    
     -2147483648   %# INTMIN
    
     -2147483647
    
     -2147483646
    
     -2147483645
    
     -2147483644
    

提交回复
热议问题