MATLAB — вопрос об этаже
-
20-08-2019 - |
Вопрос
Я новичок в MATLAB.Вот проблема:
>> a = floor(7/2.5)
a =
2.00
>> b = rem(7,2.5)
b =
2.00
>> c = floor(b/2)
c =
0
c должно быть 1, верно?Почему 0???
Другое дело, когда b = 2 вводится напрямую следующим образом:
>> b = 2
b =
2.00
>> c = floor(b/2)
c =
1.00
Решение
В двух словах:ошибки усечения.
Вы правы, в точной арифметике c должно быть 1,0.Однако, поскольку в аргументах rem вы использовали число с плавающей запятой, вы получите ответ в виде числа с плавающей запятой.Судя по всему, b равно не совсем 2, а 2,0, а это значит, что это дубль, очень близкий к 2.Следовательно, b/2 становится двойным 1,0, очевидно, в этом случае его значение немного меньше единицы, что дает вам 0 в качестве целочисленного значения.Если вы хотите предотвратить это, используйте как пол, так и потолок, и сравните значения.
Если вы хотите преобразовать ответ в целое число, просто используйте round вместо Floor.
Другие советы
Если вы добавите строку
d = b-a
к вашему примеру вы увидите результат
d =
-4.4409e-016
это означает, что Matlab вычислил число, близкое, но не точно, к 2 для b.Это довольно часто встречается при работе с числами с плавающей запятой.Пытаться
help eps
Чтобы получить больше информации.
Численные вопросы такого рода также рассматриваются в Часто задаваемые вопросы по MATLAB
Да, это числовой вопрос.Такие вещи следует использовать с осторожностью.Если вам нужна точная арифметика, вам следует попробовать «sym» для вашего числа, например.
b=rem(sym(7),sym(2.5))
Тогда у вас не будет таких ошибок, но ваши вычисления будут намного медленнее.