Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вычисления с повышенной точностью в C#

48K
16 февраля 2010 года
Alyonka89
7 / / 17.08.2009
Здравствуйте! Нужно выполнить вычисления с высокой точностью. Мне не достаточно точности double (15-16 digits), мне нужна точность не мене 18 цифр за запятой, поддерживает ли такую точность какой-нибудь тип данных в C#?
Пробовала использовать Decimal но функция Math.Cos либо не поддерживает этот тип данных, либо я просто не знаю как это реализовать. Может в С# для вычисления Cos можно использовать другую функцию?
Через ряд Тейлора получается с точностью 16 знаков, не больше, а мне этого мало.
 
Код:
static decimal f(decimal x, decimal y)
{
decimal fx;
fx = 10 * Math.Cos(5 * x) - 2 * y;
return fx;
}

При комплиляции выдается ошибка: Наиболее подходящий перегруженный метод для "System.Math.Cos(double)" имеет несколько недопустимых аргументов.
Применив Math.Cos((double)5*x) возникает ошибка: Оператор "*" не может применяться к операндам типа "double" и "decimal".
262
15 марта 2010 года
Iktomy
1.2K / / 11.10.2004
Классическая ошибка перемножения яблок на груши. Внимательно посмотрите, какими типами орудуете.

если так, то все работает
 
Код:
static double f(double x, double y)
        {
            double fx;
            fx = 10 * Math.Cos(5d * x) - 2 * y;
            return fx;
        }


Кстати, вместо Math.Cos((double)5*x), правильнее написать Math.Cos(5.00d*x)
5
15 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Iktomy

если так, то все работает

Но становится бессмысленным использование типа decimal.

262
15 марта 2010 года
Iktomy
1.2K / / 11.10.2004
Цитата: hardcase
Но становится бессмысленным использование типа decimal.



Вот так всегда, моя невнимательность меня губит:)
Не прочел первую часть вопроса.

В любом случае, стандартную функцию Math.Cos напрямую для типа decimal использовать не получится.

При конвертации всеравно точность потеряется.

 
Код:
fx = 10m * (decimal)Math.Cos(5d * (double)x) - 2m * y;


А вообще, я тут почитал это

И получил нечто похожее на то, что нужно автору

Код:
using System;
using System.Globalization;

namespace Test
{
    class Program
    {

        static void Main(string[] args)
        {
            double i = 1, j = 3d;

            Console.WriteLine(f(i, j).ToString("E50", CultureInfo.InvariantCulture));

            Console.Write("\nPress any key to exit");
            Console.ReadKey();
        }

        static double f(double x, double y)
        {
            double fx;
            fx = 10d * Math.Cos(5d * x) - 2d * y;
            return fx;
        }
    }
}
842
31 марта 2010 года
sigmov
301 / / 16.09.2008
Цитата: Alyonka89
Здравствуйте! Нужно выполнить вычисления с высокой точностью. Мне не достаточно точности double (15-16 digits), мне нужна точность не мене 18 цифр за запятой, поддерживает ли такую точность какой-нибудь тип данных в C#?
Пробовала использовать Decimal но функция Math.Cos либо не поддерживает этот тип данных, либо я просто не знаю как это реализовать. Может в С# для вычисления Cos можно использовать другую функцию?
Через ряд Тейлора получается с точностью 16 знаков, не больше, а мне этого мало.



C# не предполагает высокоточных вычислений. И вообще машинная погрешность в операциях * / ^ над числами с плавающей точкой дает такую погрешность, что смысла расширять точность double еще на несколько цифр просто нет.
А decimal внутри состоит из 2х int64 )))

Хотите высокую точность - используйте либо лучше всего - символьные пакеты, либо как минимум - дробный тип данных )))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог