Cześć,
//przedmiowa
liczba musi być z przedziału [-2;2] nazwijmy ją x. x jest z dokladnoscia 10 ^ -9. Mam więc zbior 4 000 000 000 potencjalnych liczb. mogę zapisać interpretację każdego x jako liczbę uint.
//pytanie
czy da sie obliczyc funkcje f(x)=x*sin(x)*sin(10x) nie konwertujac zmiennej na typ zmiennoprzecinkowy?
Jeżeli tak to proszę o jakąś wskazówkę, żebym mógł poszukać w internecie rozwiązania mojego problemu
no ale pi to wartosc zmienoprzecinkowa, funkcja sinus potrzebuje wlasnie takiej. zastanawiam sie czy da sie to zrobic tylko na calkowitych
Powiem tak nie wiem
bo rozumiem, że nie chodzi tobie o taki dziwoląg gdzie X to uint i do obliczeń masz
Convert.ToDouble(X)/1000000000
Ale na zdrowy rozsądek pewnie musiałbyś jeżeli się da napisać funkcje sin od zera tak aby działała tylko na wartościach całkowitych (w sensie np. że 1 000 000 interpretowałaby jako 1)
ale tracisz precyzję i możesz mieć błędy w obliczeniach - zależnie jak potem używasz wyniku i do czego
Da się,ale tracisz precyzję.uint oznacza Unsigned int.Całkowite bez znaku.Będzie ci obcinać ułamek,zaokrąglać.
Może ta biblioteczka rozwiąże problem? https://github.com/nathanpjones/DecimalMath
Działania wykonujesz na typie decimal który ma wymaganą przez Ciebie dokładność.
Obliczenia pod spodem są wykonywane przez wykorzystanie szeregu Taylora, jeśli dobrze widzę: https://github.com/nathanpjones/DecimalMath/blob/master/DecimalEx/DecimalExTrig.cs
Albo tablicę Sinusów,cosinusów pozaokrąglaną.Mnożysz coś przez 1000,a potem dzielisz przez 256.Dostajesz liczbę całkowitą z ułamkiem i ten ułamek obcinasz.Taka symulacja sinusów,cosinusów na liczbach całkowitych.
4 mld double’i to 64GB miejsca. Do ram tego nie zaladujesz, trzeba byłoby na dysku trzymać.