Aplikacja niepoprawnie wykonuje operacje matematyczne

0

Cześć wszystkim,
Ale dzisiaj złapałem zonka w C#. Panowie, sytuacja jest następująca - mam następujący kawałek kodu:

result = expressionPrefix * (component1 + component2 / component3 - component4);

wszystkie pola są typu double. Prosto z debuggera, analizuję przypadek dla poniższych wartości:

expressionPrefix = 0.2794
component1 = 2.7019
component2 = 3793075824206518
component3 = 1
component4 = 3793075824206518

Zwracam uwagę na to, że component2 = component4.

Jeśli policzyć to ręcznie, to z wyrażenia w nawiasie wychodzi 2.7019 (tyle co component1). Jednak debugger zwraca mi następującą wartość:
title łobrazecek

Jak się można domyślić, przez to całe wyrażenie ma niepoprawną wartość.

Dlaczego mój program nie potrafi tego policzyć?

0

Obrazek się nie wczytał, więc dodam, że debugger zwraca wartość wyrażenia z nawiasu 2.5

1

Uroki liczb zmiennopozycyjnych, dodajesz do bardzo małej liczby bardzo dużą i tracisz precyzje.

double ma precyzje do 16 cyfr, a Ty tam masz znacznie więcej cyfr, więc liczba jest zaokrąglana:

https://msdn.microsoft.com/pl-pl/library/678hzkk9.aspx?f=255&MSPPError=-2147217396

więc albo zmień kolejność operacji matematycznych -> nawiasy

albo użyj typu o większej precyzji

https://msdn.microsoft.com/pl-pl/library/364x0z75.aspx

0

Rzeczywiście. Zastosowanie typu decimal rozwiązało problem.

Dziękuję.

0

Teraz będzie trudniejsze pytanie związane z tematem:

Panowie, Metoda System.Math.Sinh(x) dla podanego x'a zwraca wartość typu double. Mój problem polega na tym, że wynik dla mojego x'a jest znacznie większy od double. Tracę precyzję i moje obliczenia są o kant tyłka potłuc.

Co zrobić z tym fantem? Jak mogę policzyć Sinh, tak, żeby otrzymać decimala?

0

Użyj jakiejś biblioteki do obliczeń, a nie tego, co jest wbudowane we framework.

0

Somekind znasz takowe po nazwach? Google jakoś niespecjalnie mi pomogło, być może, że źle pytam.

0

Jeśli chodzi o darmową bibliotekę do C# operujące na liczbach o większej precyzji niż double to może być ciężko, ja przynajmniej nie kojarzę żadnej.

Więc wygląda na to że pozostało Ci samemu policzyć sinh :P, jak to ze wszystkim funkcjami trygonometrycznymi, zsumuj wyrazy rozwinięcia szeregu potęgowego danej funkcji.
Im więcej zsumujesz, tym dokładniejszy wynik dostaniesz.

title

A tak z ciekawości, po co Ci aż taka dokładność?, nawet w typowych obliczeniach inżynierskich używa się double, tyle że tak się dobiera operację by błąd był jak najmniejszy i algorytm był stabliny

0

Szczerze wam Panowie powiem, że próbowałem o to samo podpytać na SO.

Zrugali mnie tam niesamowicie, że w ogóle pomyślałem o czymś takim, jak wykorzystywanie typu decimal razem z funkcjami trygonometrycznymi.
Mój problem polega na tym, że implementuję pewien algorytm do obliczeń inżynierskich. Po całym dniu korzystania z jednej publikacji zdecydowałem się zasięgnąć do innych i niestety i na szczęście dla mnie okazało się, że ta pierwsza miała po prostu błąd w formule (mnożyłem ogromne decimale przez siebie, podczas gdy nie powinienem był tego robić)

Póki co okazało się, że jednak double jest wystarczające. Niemniej jednak dziękuję wam za wszelką pomoc.

0

Zrugali mnie tam niesamowicie, że w ogóle pomyślałem o czymś takim, jak wykorzystywanie typu decimal razem z funkcjami trygonometrycznymi

Powinieneś być wdzięczny dobremu losowi, że uszedłeś z życiem. Za bardziej trywialne rzeczy tam wieszali.

1 użytkowników online, w tym zalogowanych: 0, gości: 1