Как распознать ошибки переполнения в Matlab?
Я потратил часть вчерашнего дня и сегодня отслеживал ошибку в коде Matlab. Я думал, что моя проблема заключается в индексировании (со многими структурами, которые я не определял и до сих пор привык), но это оказалось ошибкой переполнения. Я пропустил это по очень определенной причине:
>> uint8(2) - uint8(1)
ans =
1
>> uint8(2) - uint8(2)
ans =
0
>> uint8(2) - uint8(3)
ans =
0
Я ожидал, что последнее будет чем-то вроде -1
(или 255
). В середине большого вектора ошибочный 0
был трудно обнаружить, но a 255
легко выделялся.
Любые советы о том, как легко обнаружить эти проблемы в будущем? (В идеале я хотел бы отключить проверку переполнения, чтобы он работал, как C.) Переход на double
работает, конечно, но если я не понимаю, что это uint8
для начала, t help.
Ответы
Ответ 1
Вы можете начать с включения целочисленных предупреждений:
intwarning('on')
Это даст вам предупреждение при переполнении целых арифметических значений.
Остерегайтесь, однако, как описано здесь, это замедляет целочисленную арифметику, поэтому используйте только это во время отладки.
Ответ 2
Начиная с выпуска R2010b и позже, функция INTWARNING был удален, наряду с эти предупреждающие сообщения для целочисленной математики и преобразования:
-
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
См. функцию INTWARNING для управления предупреждениями о целых операциях.
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html