Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

dokladnosc obliczen

Ostatnio zmodyfikowano 2010-05-16 02:22
Autor Wiadomość
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:

C/C++
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?
P-16788
malan
» 2010-05-11 20:50:33
Rzutować na int, zaokrąglać do całkowitych :).
P-16789
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
P-16790
DejaVu
» 2010-05-11 23:06:38
C/C++
#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.
P-16792
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
P-16836
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.
P-16844
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
P-16879
DejaVu
» 2010-05-15 23:37:30
C/C++
#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
P-16881
« 1 » 2
  Strona 1 z 2 Następna strona