obliczanie masy relatywistycznej

0

Witam, jako ze jestem poczatkujacy w temacie i probuje pisac proste programiki, prosze o pomoc w ponizszym kodzie... (cos nie halo z wynikiem sk co psuje dalsze obliczenia).

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int main(){
long double c = 299792458;
long double m0, v, v2, c2, vc, sk, lorentz, mrel;
cout << "Program do obliczania masy relatywistycznej" << endl;
cout << "Podaj mase spoczynkowa (kg): ";
cin >> m0;
cout << "Podaj predkosc obiektu (m/s): ";
cin >> v;
cout << "\nMasa relatywistyczna wynosi: " << endl;
cout << setprecision(2);
v2 = pow(v, 2);
c2 = pow(c, 2);
vc = v2/c2;
sk = sqrt(1-vc);
lorentz = 1 / sk;
mrel = lorentz * m0;
cout << mrel << endl;
system("pause");
}

2

Wynik wydaje się być poprawny. Nigdy dobry z fizyki nie byłem.
Podejrzewam że zamieszanie wprowadza setprecision. Jednak nie wiem co próbujesz osiągnąć.

Zrobił bym jedną z trzech rzeczy:

  • usunął setprecision
  • dodał fixed przed tj. cout << fixed << setprecision(2);
  • zwiększył precyzje do np. 20

A tak na marginesie math.h w C++ jest w nagłówku cmath

2
rogrammer napisał(a):

cos nie halo z wynikiem sk co psuje dalsze obliczenia).

Standardowy problem zdawania pytań technicznych: zamiast wyraźnie napisać z czym problem, rzuca się jakiś niewiele znaczący ogólnik "nie działa" lub wręcz slang.
Dobrze by było nauczyć się podawać konkret.
Np:

Dla danych wejściowych:

1.0
299792000

wynikiem jest: 5.7e+02, a oczekuję: ????

0

Jak wyżej, plus mógłbyś podać źródło wzoru na tę masę, żebyśmy mogli zreprodukować.

0

imageimageOto wzory z ktorych korzystalem. Moze rzeczywiscie wszystko dziala, jednak przy malych liczbach tego nie widac. MarekR22 - dziekuje za ten kod, bede go analizowal, jednak wydaje sie za trudny dla poczatkujacego, zaczalem nauke od prostych zadan matematycznych. Jeszcze pytanie odnosnie fixed, gdzies wyczytalem, ze oznacza wpisywanie maksymalnie tylu cyfr po kropce dziesietnej ile wynosi aktualna precyzja wiec z tego co zrozumialem najpierw trzeba ustawic precyzje przez setprecision a nastepnie uzyc manipulatora fixed?

0

W usuniętej wiadomości podałeś przykładowe dane wejściowe (1 i 2). Twierdzisz że problem powstaje w momencie odejmowania tj. 1 - vc i w pewnym sensie tam powstaje. vc jest bardzo małą liczbą, a konkretnie 4.4506e-17 . Jeśli odejmiesz ją od 1 to wynikiem będzie liczba minimalnie mniejsza od 1 (0.999999999999999955494). Domyślna precyzja wyświetlania to chyba 6 miejsc po przecinku. Na potrzeby wyświetlania liczba jest zaokrąglana. Zaokrąglając otrzymujemy 1 i to wyświetla się na ekranie. Jeśli chcesz zobaczyć coś innego niż 1 to ustaw precyzje na przynajmniej 17 miejsc po przecinku. Wtedy wyświetlone zostanie np. 0.99999999999999996.

Maksymalną ilość miejsc po przecinku ustawia setprecision. fixed ustawia stałą ilość miejsc po przecinku (zgodnie z setprecision). Czyli z precyzją równą dwa 1 wyświetli się jako 1.00. Ich kolejność raczej nie ma znaczenia.

0
brokenelevator napisał(a):

W usuniętej wiadomości podałeś przykładowe dane wejściowe (1 i 2). Twierdzisz że problem powstaje w momencie odejmowania tj. 1 - vc i w pewnym sensie tam powstaje. vc jest bardzo małą liczbą, a konkretnie 4.4506e-17 . Jeśli odejmiesz ją od 1 to wynikiem będzie liczba minimalnie mniejsza od 1 (0.999999999999999955494). Domyślna precyzja wyświetlania to chyba 6 miejsc po przecinku. Na potrzeby wyświetlania liczba jest zaokrąglana. Zaokrąglając otrzymujemy 1 i to wyświetla się na ekranie. Jeśli chcesz zobaczyć coś innego niż 1 to ustaw precyzje na przynajmniej 17 miejsc po przecinku. Wtedy wyświetlone zostanie np. 0.99999999999999996.

Maksymalną ilość miejsc po przecinku ustawia setprecision. fixed ustawia stałą ilość miejsc po przecinku (zgodnie z setprecision). Czyli z precyzją równą dwa 1 wyświetli się jako 1.00. Ich kolejność raczej nie ma znaczenia.

Wlasnie to mi chodzilo po glowie. Metoda prob sam do tego doszedlem, wiec usunalem poprzedniego posta. Wiem ze moj kod jest prymitywny, bo na razie tyle udalo mi sie nauczyc. Dziekuje wszystkim za pomoc, mozna zamknac temat, przechodze do nastepnego rozdzialu... 😀

0
rogrammer napisał(a):

MarekR22 - dziekuje za ten kod, bede go analizowal, jednak wydaje sie za trudny dla poczatkujacego

A co tu jest trudnego? Po prostu kod podzielony jest na funkcje (zamiast mieć śmietnisko w main), które dokładnie odpowiadają wzorom z fizyki, które podałeś.
Jedynie dodane są dobre praktyki programowania:

  • użycie przestrzeni nazw physics
  • constexpr czyli sygnalizowanie kompilatorowi, że ta funkcja może być obliczona w trakcie kompilacji.
  • i użycie pseudonimu typu (alias) do obliczeń. Zamiast zawsze pisać long double to piszę się ftype - załata taka, że jak będziesz chciał użyć innego typu, to poprawiasz w jednym miejscu i gotowe.
  • mogłem jeszcze dodać noexcept
0
MarekR22 napisał(a):
rogrammer napisał(a):

MarekR22 - dziekuje za ten kod, bede go analizowal, jednak wydaje sie za trudny dla poczatkujacego

A co tu jest trudnego? Po prostu kod podzielony jest na funkcje (zamiast mieć śmietnisko w main), które dokładnie odpowiadają wzorom z fizyki, które podałeś.
Jedynie dodane są dobre praktyki programowania:

  • użycie przestrzeni nazw physics
  • constexpr czyli sygnalizowanie kompilatorowi, że ta funkcja może być obliczona w trakcie kompilacji.
  • i użycie pseudonimu typu (alias) do obliczeń. Zamiast zawsze pisać long double to piszę się ftype - załata taka, że jak będziesz chciał użyć innego typu, to poprawiasz w jednym miejscu i gotowe.
  • mogłem jeszcze dodać noexcept
rogrammer napisał(a):

Witam, jako ze jestem poczatkujacy w temacie i probuje pisac proste programiki, prosze o pomoc w ponizszym kodzie...

@MarekR22 początkujący mogą nie takich rzeczy jak przestrzenie nazw. Ja do dzisiaj nie do końca ogarniam jeszcze constexpry. Zwykle osoba początkująca (przyjmijmy, że to osoba która dopiero stosunkowo niedawno zaczeła uczyć się języka i zna dopiero część zagadnień z nim związanych) uczy się raczej najczęściej używanych i praktycznych elementów języka. Nikt raczej nie uczy się constexprów, przestrzeni nazw, zaawansowaej biblioteki standardowej, czy kwalifikatorów bez wiedzy na temat np. podstaw programowania obiektowego.
Wiem, że do tego dochodzi jeszcze fakt, że dla np. mnie amatora/samouka który chodzi jeszcze do szkoły "początkujący" może znaczyć coś innego niż dla senior developera z 20 letnim doświadczeniem zawodowym.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.