Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top