2016-07-13 2 views
1

У меня есть интересная проблема с Math.Sqrt в C#. Я получаю разные выходные данные в одном приложении (другое место в приложении) из Math.Sqrt.Получение разного выхода из Math.Sqrt в C#

У меня большой проект и приложение имеют множество математических вычислений.

История

длл Анимация Irrlich является использование в коде приложения :

private void Win_Load(object sender, EventArgs e) 
    { 
double myOutput = Math.Sqrt(2.0); //1.4142135623730951 
IrrlichtCreationParameters creationParameter = new IrrlichtCreationParameters(); 
creationParameter.DriverType = IrrlichtLime.Video.DriverType.Direct3D9; 
IrrlichtDevice.CreateDevice(creationParameter); 
myOutput = Math.Sqrt(2.0);//1.4142135381698608 
} 

Я хочу вывести 1.4142135623730951 каждый раз.

У кого-нибудь есть идеи, почему появился другой выход после использования IrrlichtLime.Video.DriverType.Direct3D9?

В каких случаях мы получили выходные данные, отличные от Math.sqrt?

+0

Вы не можете найти точный код? – user3185569

+0

Код double myOutput = Math.Sqrt (2.0); Оба места – user2960398

+0

Вы проходите 2.0 как жестко? или на основе некоторых расчетов? – user3185569

ответ

7

Вы непоследовательное использование типов (Eventhough я не вижу код), но вот доказательство:

double v1 = Math.Sqrt(2.0); // 1.4142135623730951 
double v2 = (float)Math.Sqrt(2.0); // 1.4142135381698608 

Вы должны использовать тот же тип везде и не делают никакой отливки или вы могли бы теряют определенную точность.

Кажется, что вы делаете много расчетов, прежде чем у вас есть значение 2.0 (это может быть ≃ 2.0). Double не может точно представлять все числа, если вам нужна точность, тогда вы должны использовать Decimal.

+0

Да, Получил такой же выход, если я использую как double v1 = (float) Math.Sqrt (2.0); На странице входа double v2 = (float) Math.Sqrt (2.0); после страницы входа Выход: 1.4142135381698608 Но я хочу вывести 1.4142135623730951 каждый раз. Потому что я использую эти значения для функции pinv (MATHLAB) (преобразование mathlab в C#). ЕСЛИ я использую это значение 1.4142135623730951, тогда я могу получить выход алгоритма mathlab прямо. – user2960398

+0

@ user2960398, пожалуйста, покажите части вашего кода, где вы используете 'Math.Sqrt', и как вы передаете его в MATHLAB. Измените свои вопросы и покажите эту информацию. – user3185569

+0

Сначала я играю с примером кода, например На странице входа double myOutput = Math.Sqrt (2.0); //1.4142135623730951 На странице приложения double myOutput = Math.Sqrt (2.0); //1.4142135381698608 – user2960398

0

Вы не говорите, что такое «неправильный» результат, но имейте в виду, что математические операции, такие как SQRT, всегда будут иметь некоторую ошибку округления. Это означает, что вам не следует напрямую сравнивать парные разряды, но убедитесь, что они близки к некоторому допуску;

const double delta = 0.00000001d; 
bool same = Math.Abs(d1 - d2) < delta; 

Так что, если вы получаете почти тот же ответ, что это о лучшем случае вы можете получить из чисел двойной точности.

+0

Оба результата правильны. Но я хочу этот результат 1.4142135623730951 (не 1.4142135381698608) в моем случае после IrrlichtDevice.CreateDevice (creationParameter); – user2960398

Смежные вопросы