2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 13:01 


15/01/12
215
Понятно, что $\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 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Igor_Dmitriev в сообщении #1642776 писал(а):
Во втором случае результат сильно удивит.

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

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 17:14 
Аватара пользователя


01/11/14
1904
Principality of Galilee
Geen в сообщении #1642787 писал(а):
Меня удивляет, что кто-то такие числа в синус подставляет....
Geen
Ну, тестировщики ещё и не такое подставляют!

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 17:17 


15/01/12
215
А началось всё с $\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 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Igor_Dmitriev в сообщении #1642792 писал(а):
А началось всё с $\sin\frac{100\cdot\pi}{3}$, ошибка проскакивает уже там.

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

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 19:13 


15/01/12
215
Подозреваю, что там всё равно ожидаются погрешности. Но нельзя же такие погрешности для таких функций допускать.
Вот ещё код, ответ закомемнтирован. Что я делаю не так?

Код:
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 


10/03/16
4444
Aeroport
Igor_Dmitriev в сообщении #1642776 писал(а):
Во втором случае результат сильно удивит.


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

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение15.06.2024, 21:49 
Заслуженный участник


12/07/07
4522
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 


15/01/12
215
GAA в сообщении #1642810 писал(а):
uint64

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

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 01:25 
Заслуженный участник


12/07/07
4522
Поддержка 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 
Заслуженный участник


18/09/21
1756
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 


15/01/12
215
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 


15/01/12
215
GAA в сообщении #1642836 писал(а):
использован Matlab 2013

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

(Оффтоп)

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

 Профиль  
                  
 
 Re: Ещё один глюк Matlab R2015b
Сообщение16.06.2024, 15:08 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Igor_Dmitriev в сообщении #1642859 писал(а):
Есть же специальные библиотеки на других языках, которые позволяют работать с большей точностью. Поэтому я почему-то думал, что Matlab встроил в себя такие библиотеки уже в первых своих версиях.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group