0

Просто возникли некоторые проблемы с переменной точностью в MATLAB ..Matlab syms переменная точность?

У меня есть код:

x = 0.1; 
syms y; 
S = solve(x+1==(1+y)/(1-y),y); 
y = double(S); 
val = abs(((2^2)*(y^2))/(2*(y-1)^2)) 

Но вал всегда округляется. Я должен получать val = 0.0049999, но вместо этого я получаю val = 0.0050.

У кого-нибудь есть идеи, почему?

Спасибо.

EDIT: Добавление дополнительного кода

x = 0.1; 
syms y; 
S = solve(x+1==(1+y)/(1-y),y); 
y = double(S); 
val = abs(((2^2)*(y^2))/(2*(y-1)^2)) 
sprintf('%22.20f',val) 

for i=1:2 
    val= val+((2^i)*(y^i))/(i*(y-1)^i); 
    sprintf('%22.20f',val) 
end 

Первые Sprintf работы и показывает правильное округление, однако второй не делает !!

+0

Как «N» и «i» относятся к вашему дополнительному коду? – Schorsch

+0

К сожалению, 'N' предназначен для' i'! – Travv92

+0

Какой результат вы ожидаете? Я получаю '0.00499999999999999924',' -0.09500000000000000111' и '-0.08999999999999999667' – Schorsch

ответ

1

Имеет отношение к floating-point representation и как Matlab displays such numbers для удобства чтения. Если добавить эту строку в конце кода:

sprintf('%22.20f',val) 

вы получите:

ans = 

0.00499999999999999924 

Редактировать
Несмотря на то, что технически имеет дело с Python, this website предлагает краткий и лаконичный обзор ограничений представления с плавающей запятой.

+0

Означает ли это только округление из-за того, как он форматирует целое число для печать? Код, который я опубликовал, представляет собой небольшой фрагмент, и фактические функции находятся в цикле. Если я поставил надпись выше цикла, она будет работать. Однако внутри цикла я все еще сталкиваюсь с проблемами ... Я отправлю код в OP сейчас. – Travv92

0

Возможно ли, что вы просто задаете свои предпочтения для отображения чисел короткими, а не длинными? Это поможет, если вы устраните это как возможность.