Pergunta

Eu sou um novato MATLAB. Aqui está o problema:

>> a = floor(7/2.5)

a =

      2.00

>> b = rem(7,2.5)

b =

      2.00

>> c = floor(b/2)

c =

         0

c deve ser 1, certo? Por que é 0 ???

É diferente quando b = 2 é introduzida directamente como se segue:

>> b = 2

b =

      2.00

>> c = floor(b/2)

c =

      1.00
Foi útil?

Solução

Em duas palavras:. Erros de truncamento

Você tem razão, c deve ser 1.0 em aritmética exata. No entanto, desde que você usou uma bóia nos argumentos de reais, você obter a resposta como um float. Aparentemente, b não é exatamente 2, mas 2.0, o que significa que é um casal muito próximo de 2. Portanto, b / 2 torna-se a dupla 1,0, aparentemente, neste caso, o seu valor é ligeiramente menor do que um, dando-lhe um 0 como o valor inteiro. Se você quiser evitar isso, use tanto chão e ceil, e comparar os valores.

Se você deseja converter a resposta para inteiro, basta usar rodada, em vez de andar.

Outras dicas

Se você adicionar a linha

d = b-a

para o seu exemplo, você vai ver o resultado

    d =

 -4.4409e-016

significando Matlab calculado um número perto, mas não exatamente, 2 para b. Isto vem-se um pouco em trabalhar com números de ponto flutuante. Tentar

help eps

para mais informações.

problemas numéricos desse tipo são também tratadas no MATLAB FAQ

Sim, isso é uma questão numérica. Você deve usar essas coisas com cuidado. Se você quiser exata aritmética, você deve tentar 'sym' para o seu número por exemplo.

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

Em seguida, você não vai qualquer um desses erros, mas seus cálculos será muito mais lento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top