Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Math Sin, Cos, Tan, Радианы 
V
    Опции темы
Dino99rus
Дата 27.10.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Math.Cos(Math.PI); //-1
Math.Tan(Math.PI); //1
Math.Sin(Math.PI); //1.2......E-16  а должно быть 0

Также операции по вычислению градусов синуса не правельно работает. 
VS2005
В чем подвох. 

Это сообщение отредактировал(а) Dino99rus - 27.10.2007, 16:41
PM MAIL   Вверх
VisualProgrammerNET
Дата 27.10.2007, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



М.б. код сих вычислений представишь? 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Dino99rus
Дата 27.10.2007, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Код

        private void FunctionSin(double b)
        {

            if (Degree.Checked == true)
                stackChis2.Push(Math.Sin(b * Math.PI / 180));
            else
                if (Radian.Checked == true)
                    stackChis2.Push(Math.Sin(b));//через переменную b  передаю значение PI
             
        }
        private void FunctionCos(double b)
        {
                if (Degree.Checked == true)
                    stackChis2.Push(Math.Cos(b * Math.PI / 180));
                else
                    if (Radian.Checked == true)
                        stackChis2.Push(Math.Cos(b));                
        }
        private void FunctionTg(double b)
        {           
                if (Degree.Checked == true)
                    stackChis2.Push(Math.Tan(b * Math.PI / 180));
                else
                    if (Radian.Checked == true)
                        stackChis2.Push(Math.Tan(b));           
        }


Cos и Tan считает нормално, но с Sin касячет

Это сообщение отредактировал(а) Dino99rus - 27.10.2007, 02:52
PM MAIL   Вверх
maxim1000
Дата 27.10.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата(Dino99rus @  27.10.2007,  01:34 Найти цитируемый пост)
Math.Sin(Math.PI); //1.2......E-16  а должно быть 0

в компьютере действительные числа представляются неточно
потому и происходят погрешности вычислений
10^-16 не такая уж и плохая погрешность для большинства задач


--------------------
qqq
PM WWW   Вверх
CYBERDREAM
Дата 27.10.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 8
Всего: 28



Тогда как выход, округление с заданной степенью точности


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
marcusmae
Дата 27.10.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Dino99rus, тригонометрические функции - одни из наиболее ёмких и неточных : для их вычисления используются разложения в ряды. Если интересно, можно разложить синус в ряд Тейлора и посмотреть, какие значения получаются при различной точности. Можно посмотреть готовые примеры программ.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Bogdan1024
Дата 27.10.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 3
Всего: 13



Код

double Sin(double a) {
return ((a == Math.PI)? 0 : Math.Sin(a));
}

Такое устраивает?


--------------------
user posted image
PM MAIL   Вверх
Dino99rus
Дата 27.10.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Bogdan1024, 
нет

А если Sin 180 (в градусах), Tan 270 (в градусах) то тоже касяк и т.д..

выходом из такой ситуации я вижу только такой.
Код

double d=1E-15;
if (d > Math.Abs(Math.Sin(b)))
          stackChis2.Push(0);
else
          stackChis2.Push(Math.Sin(b));


Но это будет 3-й касяк С# и меня это удручает.

PM MAIL   Вверх
marcusmae
Дата 27.10.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Dino99rus, простите, что встреваю, но при чём тут градусы?
Там всё считается в радианах (не в градусах и даже не в градах).
  •  градус = Math.Pi / 180
  •  града = Math.Pi / 200

Таким образом,

Код

Sin(1.5 * Math.Pi); // синус 270


В чём проблема?

Вас не устраивает точность? = Думаю, что если обратиться к другим языкам, будет что-то очень похожее. Никаких косяков тут нет.

Если формальная постановка Вашей задачи позволяет минимизировать использование тригонометрии, логарифмов и экспонент, то это лучше сделать воизбежание лишних недоразумений  smile

Вот это, извините,
Код

double d=1E-15;
if (d > Math.Abs(Math.Sin(b)))
          stackChis2.Push(0);
else
          stackChis2.Push(Math.Sin(b));


выглядит жутковато : как будто синус угла близкого (но не равного) нулю градусам становится равен нулю... Введите b = 1e-15. Получается, вносится ещё и дополнительная потеря точности.

З.Ы. : Вам известен замечательный предел :
user posted image ? smile 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Dino99rus
Дата 27.10.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



marcusmae,
Цитата(marcusmae @  27.10.2007,  15:39 Найти цитируемый пост)
Если формальная постановка Вашей задачи позволяет минимизировать использование тригонометрии, логарифмов и экспонент, то это лучше сделать воизбежание лишних недоразумений 

ну вообще-то, то что я делаю, называется калькуляторsmile (забитая тем, но пишу для себя т.к. не устраивает виндовский). Будет на подобии инженерного (да и так легче изучать язык). Но не суть в этом. Ну кто ни будь, захочет подсчитать Sin 180, Tan 180, Sin Pi, Tan(Pi) и т.п.  и увидит такой ответ (что это ноль). Если продолжать вычисления с этим, результатом, то ошибка будет увеличивать. Например: Tan(180)*10000.   то ошибка будет увеличивать. Например Tan(180)*10000.    

Цитата(marcusmae @  27.10.2007,  15:39 Найти цитируемый пост)
Там всё считается в радианах (не в градусах и даже не в градах).

ну так я там перевожу в градусы.


Цитата(marcusmae @  27.10.2007,  15:39 Найти цитируемый пост)
Вас не устраивает точность? 

да.

Цитата(marcusmae @  27.10.2007,  15:39 Найти цитируемый пост)
Если формальная постановка Вашей задачи позволяет минимизировать использование тригонометрии, логарифмов и экспонент, то это лучше сделать воизбежание лишних недоразумений 


Цитата(marcusmae @  27.10.2007,  15:39 Найти цитируемый пост)
выглядит жутковато : как будто синус угла близкого (но не равного) нулю градусам становится равен нулю... Введите b = 1e-15. Получается, вносится ещё и дополнительная потеря точности.

Вы предлагаете сравнивать входимое значение с углами при которых они  равены 0?

Это сообщение отредактировал(а) Dino99rus - 27.10.2007, 16:12
PM MAIL   Вверх
marcusmae
Дата 27.10.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Понятно.

Ну, в ладонных калькуляторах, насколько можно судить, применяется ровно то, что предложил Bogdan1024 : по всем "хорошим" углам, вместо того, чтобы считать, машинка выдаёт известные точные значения. Это, видимо, как раз и сделано для того, чтобы не смущать обывателей  smile  а то ведь завалят жалобами на "плохие" калькуляторы smile 

... а для произвольных углов будет происходить то, что Вы описали. Машинная точность - она повсюду. Другое дело, что машины считают не абы как, а следуя ISO-шным стандартам. 

Это сообщение отредактировал(а) marcusmae - 27.10.2007, 16:15


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Dino99rus
Дата 27.10.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



marcusmae, 
Цитата(marcusmae @  27.10.2007,  16:08 Найти цитируемый пост)
по всем "хорошим" углам, вместо того, чтобы считать, машинка выдаёт известные точные значения.

и этого никак не избежать
Цитата(marcusmae @  27.10.2007,  16:08 Найти цитируемый пост)
... а для произвольных углов будет происходить то, что Вы описали. Машинная точность - она повсюду. Другое дело, что машины считают не абы как, а следуя ISO-шным стандартам. 

Не понял то Вы говорите, что как я написал не корректно, то это сойдет. 
Мне хотелось бы точно знать, как можно минимизировать погрешность


Это сообщение отредактировал(а) Dino99rus - 27.10.2007, 16:22
PM MAIL   Вверх
marcusmae
Дата 27.10.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(Dino99rus @  27.10.2007,  16:15 Найти цитируемый пост)
и этого никак не избежать


Возьмите формулы разложений синуса, косинуса, и Вы поймёте, почему это происходит.
Если придумаете более точные алгоритмы для произвольных углов - впервые дадут Нобелевскую премию по математике - это как минимум  smile

Это сообщение отредактировал(а) marcusmae - 27.10.2007, 16:21


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Dino99rus
Дата 27.10.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



marcusmae, 
прошу прощении за офтом. Я там выше отредоктировал прочти.
PM MAIL   Вверх
marcusmae
Дата 27.10.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(Dino99rus @  27.10.2007,  16:01 Найти цитируемый пост)
Вы предлагаете сравнивать входимое значение с углами при которых они  равены 0?


Нет, я сомневаюсь в состоятельности приведённого Вами кода с условием на малость (и привёл тому пример), предлагаю явно забить условия для известных углов :

Код

double b = ...;

switch (b)
{
case 0 : return 0;
case Math.PI : return 0;
case 0.5 * Math.PI : return 1;
case 1.5 * Math.PI : return -1;
default : return Math.Sin(b);
}


, а в остальном расслабиться.


Это сообщение отредактировал(а) marcusmae - 27.10.2007, 16:35


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.