![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Гость_Владимир |
|
|||
Unregistered |
День добрый!
Есть задачка, где нужен cos(Pi/2). Насколько я знаю из школьного курса математики, это равно 0. Однако, получается следующая ерунда: fi = (Math.Pi/2); cos_fi = Math.cos(fi); А в результате Cos угла fi оказывается равен 6.....Е-17. Почему так? Заранее благодарен. С уважением. |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Погрешность вычислений. ИМХО 17-й знак после запятой вполне приемлимая точность.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Гость_Владимир |
|
|||
Unregistered |
А если данное значение подставляется в формулу, то можно ли его считать нулем?
Заранее спасибо. |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Если умножать некое большое число на 0.00000000000000006, то конечно ноль мы не получим. Но промежуточные результаты можно округлять например.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Гость_Владимир |
|
|||
Unregistered |
Благодарствую!
|
|||
|
||||
NotGonnaGetUs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 4 Всего: 12 |
Потому что число PI имеет бесконечное количество знаков после запятой ![]() А ты мало того, что берёшь константу ограниченную 16 знаками, так ещё делишь её на два. А как известно: cos(pi/2 + x) = - sin(x) = -x (при х->0) вот ты и получаешь в результате число порядка 10^-16/17 |
|||
|
||||
val |
|
|||
![]() Program developer ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 992 Регистрация: 14.1.2003 Где: г. Киев Репутация: нет Всего: 7 |
Скорее всего вычисление происходит через нахождение суммы ряда, аппроксимирующего функцию косинуса, естественно, число членов этого ряда конечно и, как следствие, наличие погрешности аппроксимации, которая и отражается в семнадцатом знаке после запятой.
-------------------- Терпимость - величайшее благо человечества... Ярчайший признак интеллекта – постоянно хорошее настроение… |
|||
|
||||
NotGonnaGetUs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 4 Всего: 12 |
точность членов ряда тоже конечна. как бы то ни было, что заказали, то и получили - величину отклонение fi от истинного значения pi/2 ![]() вот пример: [quot] double fi = (Math.PI/2)+0.000001; double cos_fi = Math.cos(fi); System.out.println("cos: " + cos_fi); [/quot] Получаем "cos: -9.999999998563343E-7" - т.е. то самое отклонение. |
|||
|
||||
Guest |
|
||||
Unregistered |
Хм. Почему же тогда: fi = (Math.Pi/2); sin_fi = Math.sin(fi); В результате синус фи = 1. Т.е. с косинусом такие вещи не прокатывают, а с синусом со свистом? |
||||
|
|||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
есть абсолютная погрешность, а есть относительная
при сохранении в double сохраняется мантисса и порядок числа так что в случае с 0.00000001 сохраняется 1e-8 (если не обсчитался нулей) а если 1.00000001, то придется сохранить 1.00000001e0 так вот точность самой мантиссы ограничена, 1 запомнить просто, а 1.00000001 - нужно достаточно бит... Добавлено @ 13:56 т.е. в случае синуса тоже получилось 1.00...001 (например), но из-за погрешности это просто обрезалось... -------------------- qqq |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |