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

cmath i precyzja liczb

Ostatnio zmodyfikowano 2010-12-31 16:54
Autor Wiadomość
PawelBo
Temat założony przez niniejszego użytkownika
cmath i precyzja liczb
» 2010-12-26 07:46:36
Witam, jestem tu nowy, dopiero się uczę C++ i ugrzęzłem przy jednym zadaniu... nie jest to projekt na zaliczenie, tylko przykładowe zadanie z podręcznika. Chodzi o 0 (zero)? Dodałem do programu sqrt aby sprawdzić poprawność wyniku i niestety sqrt(0) nie oblicza, a w zasadzie to mu się nie dziwię, bo jest to sqrt(-0), mimo setprecision. Podaję cały program:

C/C++
#include <iostream>
#include <cmath>  // tutaj znajduje siê deklaracja funkcji fabs
#include <iomanip>
#include <cstdlib>
using namespace std;

int main( int argc, char * argv[] )
{
    double x;
    /* W tym zadaniu wykorzystamy fakt iż C, w przeciwieństwie do Pascala,
        pozwala na sterowanie pętlą for za pomocą dowolnego typu zmiennych,
        a nie tylko zmiennych przeliczalnych. Dodatkowo zmodyfikujemy warunki aby
        zabezpieczyć się przed ewentualnymi błędami wynikającymi z porównywania
        liczb rzeczywistych, które siłą rzeczy nie są dokładnie pamiętane przez
        komputer. */
    cout << "x\ty\tsqrt(x)";
   
    for( x = - 0.5; x < 1.55; x += 0.1 )
    {
        cout << setiosflags( ios_base::fixed );
        cout << setprecision( 1 );
        cout << endl << x << "\t";
        if( x < 0.05 )
             cout << x << "\t" << sqrt( x );
        else if( x < 1.05 )
             cout << 2 * x << "\t" << sqrt( x );
        else
             cout << fabs( x - 2 ) << "\t" << sqrt( x );
       
    }
   
    cout << endl;
    system( "pause" );
    return 0;
}
P-25568
szyx_yankez
» 2010-12-26 08:13:05
Skorzystaj z metody pow.
pow(potęgowana liczba, stopień potęgi)
C/C++
#include <iostream>
#include <cmath>  // tutaj znajduje siê deklaracja funkcji fabs
#include <iomanip>
#include <cstdlib>
using namespace std;

int main( int argc, char * argv[] )
{
   
   
   
   
    double x;
    /* W tym zadaniu wykorzystamy fakt iż C, w przeciwieństwie do Pascala,
        pozwala na sterowanie pętlą for za pomocą dowolnego typu zmiennych,
        a nie tylko zmiennych przeliczalnych. Dodatkowo zmodyfikujemy warunki aby
        zabezpieczyć się przed ewentualnymi błędami wynikającymi z porównywania
        liczb rzeczywistych, które siłą rzeczy nie są dokładnie pamiętane przez
        komputer. */
   
    cout << "x\ty\tsqrt(x)";
   
    for( x = - 0.5; x < 1.55; x += 0.1 )
    {
        cout << setiosflags( ios_base::fixed );
        cout << setprecision( 2 );
        cout << endl << x << "\t";
        if( x < 0.05 )
             cout << x << "\t" << pow( x, 2 );
        else if( x < 1.05 )
             cout << 2 * x << "\t" << pow( x, 2 );
        else
             cout << fabs( x - 2 ) << "\t" << pow( x, 2 );
       
    }
   
    cout << endl;
    system( "pause" );
    return 0;
}
P-25570
PawelBo
Temat założony przez niniejszego użytkownika
int/double c.0
» 2010-12-26 08:37:06
rozwiązałem to inaczej, ale dzięki:)
C/C++
#include <iostream>
#include <cmath>  // tutaj znajduje siê deklaracja funkcji fabs
#include <cstdlib>
using namespace std;

int main( int argc, char * argv[] )
{
    double b, x;
    int a;
    /* W tym zadaniu wykorzystamy fakt i¿ C, w przeciwieñstwie do Pascala,
        pozwala na sterowanie pêtl¹ for za pomoc¹ dowolnego typu zmiennych,
        a nie tylko zmiennych przeliczalnych. Dodatkowo zmodyfikujemy warunki aby
        zabezpieczyæ siê przed ewentualnymi b³êdami wynikaj¹cymi z porównywania
        liczb rzeczywistych, które si³¹ rzeczy nie s¹ dok³adnie pamiêtane przez
        komputer. */
    cout << "x\ty\tsqrt(x)";
    for( a = - 5; a < 16; a++ )
    {
        b = 10.0;
        x = a / b;
        cout << endl << x << "\t";
        if( x < 0.05 )
             cout << x << "\t" << sqrt( x );
        else if( x < 1.05 )
             cout << 2 * x << "\t" << sqrt( x );
        else
             cout << fabs( x - 2 ) << "\t" << sqrt( x );
       
    }
   
    cout << endl;
    system( "pause" );
    return 0;
}
P-25571
PawelBo
Temat założony przez niniejszego użytkownika
jednak nie do konca...
» 2010-12-30 07:28:49
po przemyśleniach problem jest nie do końca rozwiązany... bo chodzi o zwiększanie pętli liczbą rzeczywistą np. +0.7, nie wiem jak to zrobić? może ktoś ma jakiś pomysł?
P-25923
DejaVu
» 2010-12-30 07:32:58
C/C++
//int a; <= do piachu
for( double a = - 5; a < 16; a += 0.7 )
{
    //...
}
P-25924
PawelBo
Temat założony przez niniejszego użytkownika
0?
» 2010-12-30 07:34:55
DejaVu -> zerknij na mój pierwszy wpis - chodzi o '0' - żeby zero było zerem a nie np. '-0.0'?
P-25925
DejaVu
» 2010-12-30 07:38:09
C/C++
if( wynik < 0 ) wynik = - wynik;

lub
C/C++
if( wynik < 0 ) wynik = 0;

Istnieje coś takiego jak błędy wynikające z obliczeń na liczbach rzeczywistych. Na 50 miejscu po przecinku pojawia się pewnie jakaś cyferka i stąd masz znak ujemny przed 0.
P-25926
PawelBo
Temat założony przez niniejszego użytkownika
b/t
» 2010-12-31 16:51:18
DejaVu -> jeżeli już to if(( wynik < 0 )&& ( wynik > -0.1)) wynik = 0; jeżeli zwiększamy o 0.1, ale nie podoba mi się ten sposób rozwiązania problemu, jak coś wymyślę to dam znać :)
P-26028
« 1 » 2
  Strona 1 z 2 Następna strona