MATLAB - напольный вопрос - PullRequest
8 голосов
/ 26 июня 2009

Я новичок в 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

Ответы [ 4 ]

11 голосов
/ 26 июня 2009

В двух словах: ошибки усечения.

Вы правы, с должно быть 1,0 в точной арифметике. Однако, поскольку вы использовали float в аргументах rem, вы получите ответ как float. По-видимому, b это не точно 2, а 2.0, что означает, что это двойное число, очень близкое к 2. Следовательно, b / 2 становится двойным 1.0, очевидно, в этом случае его значение немного меньше единицы, что дает вам 0 целочисленное значение. Если вы хотите предотвратить это, используйте и floor, и ceil, и сравните значения.

Если вы хотите преобразовать ответ в целое число, просто используйте round вместо floor.

6 голосов
/ 26 июня 2009

Если добавить строку

d = b-a

к вашему примеру вы увидите результат

    d =

 -4.4409e-016

означает, что Матлаб вычислил число, близкое, но не совсем, 2 для b. Это очень важно при работе с числами с плавающей запятой. Попробуйте

help eps

для получения дополнительной информации.

2 голосов
/ 26 июня 2009

Численные вопросы такого рода также рассматриваются в MATLAB FAQ

0 голосов
/ 30 марта 2012

Да, это численная проблема. Вы должны использовать такие вещи с осторожностью. Если вам нужна точная арифметика, попробуйте ввести «sym» для вашего числа, например:

b=rem(sym(7),sym(2.5))

Тогда таких ошибок не будет, но ваши вычисления будут намного медленнее.

...