dmx81 Temat założony przez niniejszego użytkownika |
dokladnosc obliczen » 2010-05-11 20:29:48 witam. czy mozna zaokraglic wartosc przetrzymywanej w zmiennej liczby? bo np daje taka petle: for( int i = 0; i < 360; i++ ) { textprintf_ex( screen, font, 30, 100, makecol( 244, 2, 250 ), 0, "sin %d = %0.6f b/c = %0.6f", i, sin( i * M_PI / 180 ), b / c ); textprintf_ex( screen, font, 30, 120, makecol( 211, 77, 250 ), 0, "cos %d = %0.6f a/c = %0.6f", i, cos( i * M_PI / 180 ), a / c ); if( sin( i * M_PI / 180 ) == b / c && cos( i * M_PI / 180 ) == a / c ) textprintf_ex( screen, font, 50, 360, makecol( 0, 250, 200 ), 0, "SIN && COS !!!" ); readkey(); }
gdzie po kolei podstawiam wartosc kata od 0 do 359 i obliczam wart sin i cos, po czym porownuje z rzeczywistymi wartosciami, czyli stosunek dlugosci bokow, niestety nigdy sie nie pokrywaja, jak najlepiej sobie z tym poradzic? |
|
malan |
» 2010-05-11 20:50:33 Rzutować na int, zaokrąglać do całkowitych :). |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-05-11 20:53:53 nie e nie da rady panie malan :P sinus ma wartosc max 1, tak jak stosunek a/c czyli dlugosci bokow, max zawsze bedzie 1... czyli potrzebne mi sa 0.001 itd, a tak bym mial 360 wartosci 0 lub 1 ...
szukam czegos, zeby zmienna float pamietala tylko np 4 miejsca po przecinku, reszte nawet jak pamieta, niech ustawi na 0 - wiem ze stosuje sie czasem mnozenie przez 10000 i pozniej dzielenie, ale nie wiem, czy tu bedzie to dobre rozwiazanie i czy da to rezultac |
|
DejaVu |
» 2010-05-11 23:06:38 #include <cmath> #include <iostream>
double wynik( double fWynik, int iDokladnosc ) { long long ble = pow( 10, iDokladnosc ); return static_cast < double >( static_cast < long long >( ble * fWynik ) ) / ble; }
int main() { std::cout << wynik( sqrt( 2 ), 2 ) << std::endl; return 0; }
Trzeba mieć na uwadze, że kod 'ucina' pozostałą część, więc np. z liczby 1.005, da Ci 1.00 (przy dwóch miejscach po przecinku) - ale to możesz sobie poprawić np. dopisując round'a w odpowiednim miejscu. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-05-15 03:09:42 dzieki za rozwiazanie:) mam pytanie, dla dokladnosci 2, po przecinku mam wiecej, niz 2 cyfry, sa jakby kopia pierwszych dwoch po przecinku tzn 1.4343, 5.1515 - przynajmniej u mnie tak dziala |
|
DejaVu |
» 2010-05-15 12:25:50 Liczby rzeczywiste są przechowywane w postaci potęg liczby 2. Obliczenia w komputerze na tych liczbach zawsze są przybliżone - w każdym razie to jest zbyt duża niedokładność. Musisz mieć gdzieś błąd w swoim programie. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-05-15 22:13:38 tu nie chodzi o jakies bledy... prosze skompilowac ten kod, ktory Pan wkleil - dokladnosc 1 - wynik 1.4 dokladnosc 2 - wynik 1.41414 (zamiast 1.4) dokladnosc 3 - wynik 1.41 dokladnosc 4 - wynik 1.41414 dokladnosc 5 i wiecej - wynik 1.41421 |
|
DejaVu |
» 2010-05-15 23:37:30 #include <cmath> #include <iostream>
double wynik( double fWynik, int iDokladnosc ) { long long ble = pow( 10, iDokladnosc ); return static_cast < double >( static_cast < long long >( ble * fWynik ) ) / ble; }
int main() { for( int i = 0; i < 5; i++ ) std::cout << "Dokladnosc = " << i << "; wynik = " << wynik( sqrt( 2 ), i ) << std::endl; return 0; }
Wyjście: Dokladnosc = 0; wynik = 1 Dokladnosc = 1; wynik = 1.4 Dokladnosc = 2; wynik = 1.41 Dokladnosc = 3; wynik = 1.414 Dokladnosc = 4; wynik = 1.4142 |
|
« 1 » 2 |