| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Math Sin, Cos, Tan |
| Автор: Dino99rus 27.10.2007, 01:34 |
| Math.Cos(Math.PI); //-1 Math.Tan(Math.PI); //1 Math.Sin(Math.PI); //1.2......E-16 а должно быть 0 Также операции по вычислению градусов синуса не правельно работает. VS2005 В чем подвох. |
| Автор: VisualProgrammerNET 27.10.2007, 02:36 |
| М.б. код сих вычислений представишь? |
| Автор: Dino99rus 27.10.2007, 02:50 | ||
Cos и Tan считает нормално, но с Sin касячет |
| Автор: maxim1000 27.10.2007, 09:42 |
в компьютере действительные числа представляются неточно потому и происходят погрешности вычислений 10^-16 не такая уж и плохая погрешность для большинства задач |
| Автор: CYBERDREAM 27.10.2007, 09:49 |
| Тогда как выход, округление с заданной степенью точности |
| Автор: marcusmae 27.10.2007, 12:50 |
| Dino99rus, тригонометрические функции - одни из наиболее ёмких и неточных : для их вычисления используются разложения в ряды. Если интересно, можно разложить синус в ряд Тейлора и посмотреть, какие значения получаются при различной точности. Можно посмотреть готовые http://pasadvice.narod.ru/sum.htm. |
| Автор: Bogdan1024 27.10.2007, 13:11 | ||
Такое устраивает? |
| Автор: Dino99rus 27.10.2007, 15:12 | ||
| Bogdan1024, нет А если Sin 180 (в градусах), Tan 270 (в градусах) то тоже касяк и т.д.. выходом из такой ситуации я вижу только такой.
Но это будет 3-й касяк С# и меня это удручает. |
| Автор: marcusmae 27.10.2007, 15:39 | ||||
| Dino99rus, простите, что встреваю, но при чём тут градусы? Там всё считается в радианах (не в градусах и даже не в градах).
Таким образом,
В чём проблема? Вас не устраивает точность? = Думаю, что если обратиться к другим языкам, будет что-то очень похожее. Никаких косяков тут нет. Если формальная постановка Вашей задачи позволяет минимизировать использование тригонометрии, логарифмов и экспонент, то это лучше сделать воизбежание лишних недоразумений Вот это, извините,
выглядит жутковато : как будто синус угла близкого (но не равного) нулю градусам становится равен нулю... Введите b = 1e-15. Получается, вносится ещё и дополнительная потеря точности. З.Ы. : Вам известен замечательный предел : ? |
| Автор: marcusmae 27.10.2007, 16:08 |
| Понятно. Ну, в ладонных калькуляторах, насколько можно судить, применяется ровно то, что предложил Bogdan1024 : по всем "хорошим" углам, вместо того, чтобы считать, машинка выдаёт известные точные значения. Это, видимо, как раз и сделано для того, чтобы не смущать обывателей ... а для произвольных углов будет происходить то, что Вы описали. Машинная точность - она повсюду. Другое дело, что машины считают не абы как, а следуя http://www.iso.org/iso/home.htm-шным стандартам. |
| Автор: Dino99rus 27.10.2007, 16:15 | ||||
marcusmae,
и этого никак не избежать
Не понял то Вы говорите, что как я написал не корректно, то это сойдет. Мне хотелось бы точно знать, как можно минимизировать погрешность |
| Автор: marcusmae 27.10.2007, 16:19 |
Возьмите формулы разложений синуса, косинуса, и Вы поймёте, почему это происходит. Если придумаете более точные алгоритмы для произвольных углов - впервые дадут Нобелевскую премию по математике - это как минимум |
| Автор: Dino99rus 27.10.2007, 16:24 |
| marcusmae, прошу прощении за офтом. Я там выше отредоктировал прочти. |
| Автор: marcusmae 27.10.2007, 16:32 | ||||
Нет, я сомневаюсь в состоятельности приведённого Вами кода с условием на малость (и привёл тому пример), предлагаю явно забить условия для известных углов :
, а в остальном расслабиться. |
| Автор: Dino99rus 27.10.2007, 16:40 |
| Думаю вопрос исчерпас. Набиру 100 постов и всем плюсику поставлю кто помагал в решении проблем. |
| Автор: Wizard_Memfis 28.10.2007, 17:42 |
| Полностью поддержую marcusmae, это будет именно то, что нужно!Кстати нам препод говорил, что действительно в калькуляторах так и забивают известными значениями! |