MATLAB - pergunta chão
-
20-08-2019 - |
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
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.