Problem z double (niedokładny wynik)
Ostatnio zmodyfikowano 2009-06-11 12:10
DejaVu |
» 2009-06-11 12:41:56 b= 5 a= 0 Pole= 0 Operacja pierwsza..... b= 5 sqrt(2)= 1.41421 a= 3.53553 Druga operacja... a= 12.5 Pole= 0 Pole tego trójkąta wynosi: 12.5 Gdzie jest tutaj jakiś 'błąd'? |
|
programator Temat założony przez niniejszego użytkownika |
» 2009-06-11 12:52:57 Druga operacja to: a = pow( a, 2 ); czyli: a = 3.53553 * 3.53553;powinno być: a = 12.4999723809a jest: a = 12.5A ja nie chcę tego zaokrąglenia..... |
|
DejaVu |
» 2009-06-11 12:54:58 To że wypisujesz, że sqrt(2)=1.41421 wcale nie oznacza, że liczba w pamięci ma taką reprezentację - ma ona dużo więcej miejsc po przecinku. Musisz ją uciąć, żeby uzyskać pseudo 'prawidłowy' wynik. #include<iostream> #include <iomanip> #include <cmath> long double poPrzecinku( long double liczba, long poPrzecinku ) { long long iLiczba = 10; iLiczba = static_cast < long long >( pow( iLiczba, poPrzecinku ) ); return round( liczba * iLiczba ) / iLiczba; }
using namespace std; int main() { double a = 0, b = 5, Pole = 0; cout << "b= " << b << endl; cout << "a= " << a << endl; cout << "Pole= " << Pole << endl; cout << "Operacja pierwsza.....\n"; a = b / sqrt( 2 ); a = poPrzecinku( a, 5 ); cout << "b= " << b << endl; cout << "sqrt(2)= " << sqrt( 2 ) << endl; cout << "a= " << a << endl; cout << "Druga operacja...\n"; a = pow( a, 2 ); cout << "a= " << a << endl; cout << "Pole= " << Pole << endl; cout << "Pole tego tr˘jkĄta wynosi: " << setprecision( 8 ) << a; system( "pause>>NULL" ); return( 0 ); }
|
|
programator Temat założony przez niniejszego użytkownika |
» 2009-06-11 12:58:28 Dzięki wielkie, muszę tylko rozgryźć ten kodzik, jak to działa:) Temat do zamknięcia:)
|
|
manfred |
» 2009-06-11 12:10:32 Jeśli nie widzisz, to to jest zaokrąglone do piątego miejsca po przecinku. Ta niedokładność wynika ze sposobu, w jaki są liczby zmiennoprzecinkowe zapisane w komputerze - określa to jakaś tam norma IEEE :>. |
|
1 « 2 » |