Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2012, 11:08   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Лампочка Точность Math.Cos

Уже несколько лет использую для программирования язык C#, сотни раз использовал функции из класса Math и с недавних пор перешел на Gtk#.
Встала очередная задача поработать с функцией Math.Cos(x). Как известно, данная функции нужно передать градусную меру угла, переведенную в радианы (x*Math.PI/180.0). Написал простейший код в одну строку:
Код:
Double x;
do
{
x=Convert.ToDouble(Console.ReadLine());
y=Math.Cos(x*Math.PI/180.0);
}
while(Console.ReadKey().Key!=System.ConsoleKey.Escape);
Поскольку являюсь страстным любителем прогонять весь свой код через отладчик, решил и эту элементарщину прогнать. Ввожу значение x=90, в отладчике смотрю чему равен y и вижу совсем не ноль (очень близкое значение, но все же не ноль) - очень странно, ведь косинус 90 градусов равен ровно 0. Прогоняю с другими значениями, результат которых должен быть отличен от нуля - все нормально. Начинаю думать, что проблема с точностью связана с реализацией Math.Cos в Gtk#. Прошу другого человека написать этот 7-ми строчный код в VS и запустить под Framework - результат тот же. Начинаю искать в сети схожие проблемы и нахожу темы на Vingrad и CyberForum. Вывод: либо неточность возникает в библиотеках программирования, либо в аппаратной части (у сопроцессора кишка тонка посчитать cos с абсолютной точностью).
Ладно, для моей задачи погрешность в миллионные-миллиардные не страшны, но допустим что реализуется программа для каких-нибудь аэрокосмических исследований, где основная формула, допустим представляется в виде:
Цитата:
mainResult=y/(1-1000000*Math.Cos(x));//y=10.0; x=0.0
Теперь допустим, что нужно посчитать значение этой функции при аргументе x=90 градусов. Как уже указывал ранее, Math.Cos имеет некоторую погрешность и предположим, что она равна "0.000001". В итоге мы получим:
Цитата:
mainResult=y/(1-1)=y/0=Infinity
, т.е. бесконечность вместо числа y=10 - существенная разница. А теперь представим к каким последствиям может привести эта незначительная погрешность в косинусе(еще раз повторю, что берем какие-нибудь аэрокосмические исследования).
Хотелось бы попробовать посчитать cos(0) напрямую на сопроцессоре, используя команды Ассемблера, чтобы оперделить кто виноват - устройство или высокоуровневые библиотеки.
Поскольку компилятора ассемблерного кода у меня нет, хотелось бы Вас попросить проверить это на нем, а также услышать точку зрения по-поводу указанной проблемы.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 02.11.2012, 11:14   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Mixim
я не по теме....
может знаете ссылочку на руководство по установке Gtk#/моно и т.д.
чето с лету ничего похожего не нашел. так чтоб для чайников.
eval вне форума Ответить с цитированием
Старый 02.11.2012, 11:47   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
я не по теме....
может знаете ссылочку на руководство по установке Gtk#/моно и т.д.
чето с лету ничего похожего не нашел. так чтоб для чайников.
Вместо Windows стал использовать Linux, а там это все ставится просто из Центра приложений в один клик. На сайте Mono по-моему как-то натыкался про установку Gtk# в Windows, но точно ссылку не помню. Также это можно посмотреть на разных русскоязычных форумах, связанных с Mono.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
библиотека math WIN32APIist Общие вопросы C/C++ 14 13.09.2013 09:24
Программа Math [Jank] Софт 11 28.10.2012 14:05
Рекурсия. Вычислить рекурсивно функцию вида y=cos(x)+cos(x^2)+cos(x^3)+...+cos( x^n). мария71 Паскаль, Turbo Pascal, PascalABC.NET 4 31.03.2012 23:17
вычислить: У=cos(x)+cos(x)*(x)+ cos(X)*(X)*(X)+...+cos(X)(в n степени) КАША Помощь студентам 20 01.11.2010 17:34
Math Zeraim Общие вопросы Delphi 7 04.06.2008 23:47