2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 13:01 
Понятно, что $\frac{\sqrt{3}}{2}\cdot\sin(\frac{N\cdot\pi}{3})$, где $N$ не делится на $3$, является рациональным числом, равным по модулю $0.75$. Попробуйте подставить $N = 10^{12}$ и $N = 10^{15}$ . Во втором случае результат сильно удивит. Это не первый глюк Matlab. У вас на новых версиях такие же ошибки?

Код:
[ sin(1e12*pi/3) * sqrt(3)/2;  sin(1e15*pi/3) * sqrt(3)/2]

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 15:31 
Аватара пользователя
Igor_Dmitriev в сообщении #1642776 писал(а):
Во втором случае результат сильно удивит.

Меня и в первом удивляет, но не результат, а что кто-то такие числа в синус подставляет....

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 17:14 
Аватара пользователя
Geen в сообщении #1642787 писал(а):
Меня удивляет, что кто-то такие числа в синус подставляет....
Geen
Ну, тестировщики ещё и не такое подставляют!

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 17:17 
А началось всё с $\sin\frac{100\cdot\pi}{3}$, ошибка проскакивает уже там. Посмотрел, как далеко она заходит. Оказалось, что при больших числах ошибки не только в синусах, а во многих функциях.

Код:
fprintf('%1.20f\n', [ sin(1e01*pi/3) * sqrt(3)/2;  sin(1e2*pi/3) * sqrt(3)/2]);

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 18:07 
Аватара пользователя
Igor_Dmitriev в сообщении #1642792 писал(а):
А началось всё с $\sin\frac{100\cdot\pi}{3}$, ошибка проскакивает уже там.

А Вы, вообще, хоть один раз ровно три четверти получили?....

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 19:13 
Подозреваю, что там всё равно ожидаются погрешности. Но нельзя же такие погрешности для таких функций допускать.
Вот ещё код, ответ закомемнтирован. Что я делаю не так?

Код:
fprintf('%20d\n', 1e17-123);  % 99999999999999872
fprintf('%20d\n', 100000000000000000-123);  % 99999999999999872


Питон ведёт себя более предсказуемо, хотя на синусах спотыкается быстрее.

Код:
print(100000000000000000 - 123) // ответ такой, как и ожидалось  99999999999999877


-- 15.06.2024, 18:21 --

Если у кого-то стоит Octave и если не лень, проверьте, пожалуйста, приведённые примеры и примеры с синусами.

-- 15.06.2024, 18:42 --

Судя по всему, дело в допустимой точности, которую нельзя изменить, 16-му символу уже нельзя доверять. Интересно, в Octave точно так же?

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 20:43 
Igor_Dmitriev в сообщении #1642776 писал(а):
Во втором случае результат сильно удивит.


Вы по-настоящему удивитесь, когда увидите отрицательные собственные значения у $A^TA$

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 21:49 
Igor_Dmitriev в сообщении #1642802 писал(а):
Подозреваю, что там всё равно ожидаются погрешности. Но нельзя же такие погрешности для таких функций допускать.
Вот ещё код, ответ закомемнтирован. Что я делаю не так?
Код:
fprintf('%20d\n', 1e17-123);  % 99999999999999872
fprintf('%20d\n', 100000000000000000-123);  % 99999999999999872
Посмотрите формат double. Нужно воспользоваться подходящими объектами. Например uint64
Используется синтаксис Matlab M
>> uint64(1e17)-123
ans = 99999999999999877
>> uint64(100000000000000000) -123
ans = 99999999999999877
 
или sym
Используется синтаксис Matlab M
>> sym(1e17)-123
 ans =  99999999999999877

Igor_Dmitriev в сообщении #1642802 писал(а):
Если у кого-то стоит Octave и если не лень, проверьте, пожалуйста, приведённые примеры и примеры с синусами.
Octave 7.3.0 аналогично Matlab:
Используется синтаксис Matlab M
>> fprintf('%20d\n', 1e17-123)
   99999999999999872
>> fprintf('%20d\n', 100000000000000000-123);
   99999999999999872
>> sym('1e17')-123
ans = (sym) 99999999999999877
>> [ sin(1e12*pi/3) * sqrt(3)/2;  sin(1e15*pi/3) * sqrt(3)/2]
ans =
  -0.7500
  -0.6922


В общем, в случае с double — это не глюк, а даже очень ожидаемое поведение. Заголовок ветки вводит в заблуждение.

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 22:52 
GAA в сообщении #1642810 писал(а):
uint64

Спасибо, про sym знал. А какой тип использовать для синусов и других трансцендентных функций?

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 01:25 
Поддержка uint64 введена уже давно. В моём предыдущем сообщении использован Matlab 2013. Прошу прощение, что сразу не указал.


В данном конкретном случае всё будет работать «автоматически»
Используется синтаксис Matlab M
sin(sym(1e15)*sym('pi')/3)*sqrt(3)/2
ans = -3/4

Более того даже так
Используется синтаксис Matlab M
>> sin(1e15*sym(pi)/3)*sqrt(3)/2
ans = -3/4

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 01:26 
Igor_Dmitriev в сообщении #1642802 писал(а):
Судя по всему, дело в допустимой точности, которую нельзя изменить, 16-му символу уже нельзя доверять. Интересно, в Octave точно так же?
Почитайте про то, как числа представляются в компьютере, а именно про числа с плавающей точкой single precision и double precision.
Matlab, Octave и почти все языки програмирования оперируют такими числами.
Это необходимо знать, если хотите заниматся компьютерными вычислениями.

В некоторых приложениях символьных вычислений (как Maxima) или языках (как Python) доступны Arbitrary-precision arithmetic. В других языках (как C/C++) это может быть доступно в виде внешней библиотеки.
Тут можно оперировать длинными числами и как правило большими дробя не теряя точности (или можно работать с десятичными неточными дробями, но задавать точность самостоятельно, например 100 десятичных знаков).
Но операции с такими числами гораздо медленнее чем операции с машинными числами.

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 12:30 
zykov в сообщении #1642837 писал(а):
Но операции с такими числами гораздо медленнее чем операции с машинными числами.

Спасибо, надо действительно обновить знания по числам с плавающей точкой. Есть же специальные библиотеки на других языках, которые позволяют работать с большей точностью. Поэтому я почему-то думал, что Matlab встроил в себя такие библиотеки уже в первых своих версиях.

Цитата:
Integers from $-2^{53}$ to $2^{53}$ (−9,007,199,254,740,992 to 9,007,199,254,740,992) can be exactly represented.


$10^{17}$ как раз и превышает на порядок максимально допустимое для точности целых чисел значение. Но согласитесь, такого от Matlab всё равно не ожидаешь. Мне казалось, что перед вычислениями Matlab упрощает всё, что можно, и только потом производит операции, в ходе которых теряется точность.

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 14:01 
GAA в сообщении #1642836 писал(а):
использован Matlab 2013

Спасибо за проведённые проверки Octave.

(Оффтоп)

Думал, что я с 2015 окажусь самым возрастным

 
 
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 15:08 
Аватара пользователя
Igor_Dmitriev в сообщении #1642859 писал(а):
Есть же специальные библиотеки на других языках, которые позволяют работать с большей точностью. Поэтому я почему-то думал, что Matlab встроил в себя такие библиотеки уже в первых своих версиях.

А Вы посчитайте свой "синус" миллион раз, хотя бы - сразу увидите разницу... особенно на компах эпохи первых версий матлаба.

 
 
 [ Сообщений: 14 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group