• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zwraca 0 przy działaniach na dużych liczbach

Cloud VPS
0 głosów
193 wizyt
pytanie zadane 18 października 2020 w C i C++ przez patrykcyranek Nowicjusz (160 p.)
zamknięte 23 października 2020 przez patrykcyranek

Piszę program który liczy iloczyn skalarny wektorów, przy małych liczbach nie ma problemu i wszystko działa, problem zaczyna się przy większych bo program zwraca wartość 0 z dodawania iloczynów kilku wektorów gdzie wynik powinien być ujemny (sprawdzałem czy iloczyny się nie zerują ale nie). Wyczytałem że podobno trzeba posortować iloczyny poszczególnych wektorów od największego do najmniejszego żeby zadziałało ale niestety nie pomogło ;/.

liczby przy których program nie działa:

4 wektory

współrzędne X kolejno: 1e20, -1e3, 0.1, 1e20

współrzędne Y kolejno: 1, 4, -4, -1

Wynik który powinien wyjść: -4000.4

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	double *wektorX, *wektorY, *iloczyn, wynik;
	cout << "Wprowadź ilość wektorów: ";
	int rozmiar;
	cin >> rozmiar;
	wektorX = new double [rozmiar];
	wektorY = new double [rozmiar];
	iloczyn = new double [rozmiar];
	cout << "Wprowadź współrzędne X wszystkich wektorów :" <<endl;
	for (int i=0; i<rozmiar; i++)
	{
		cin >> wektorX[i];
	}
	cout << "Wprowadź współrzędne Y wszystkich wektorów :" <<endl;
	for (int i=0; i<rozmiar; i++)
	{
		cin >> wektorY[i];
	}
	for (int i=0; i<rozmiar; i++)
	{
		iloczyn[i]=wektorX[i]*wektorY[i];
	}
	sort (iloczyn, iloczyn + rozmiar, greater <double> ());
	for (int i=0; i<rozmiar; i++)
	{
		wynik = wynik + iloczyn[i];
	}
	cout << wynik;
	return 0;
}
komentarz zamknięcia: Dostałem odpowiedź
komentarz 18 października 2020 przez overcq Pasjonat (22,630 p.)
Przekraczasz maksymalną precyzję double?
komentarz 18 października 2020 przez patrykcyranek Nowicjusz (160 p.)
Precyzja rozumiem że chodzi o ilość cyfr po przcinku? Raczej nie a przy zmianie na long double wynik to "nan" i też nie mam pojęcia skąd mogło się to wziąć?
komentarz 18 października 2020 przez overcq Pasjonat (22,630 p.)
U mnie przy zamiane na long double daje wynik -4000, a po zmianie tych wysokich współrzędnych na 1e18 daje wynik -4000.38.

Poza tym nie ustawiasz początkowej wartości zmiennej wynik.
komentarz 18 października 2020 przez patrykcyranek Nowicjusz (160 p.)
Okej, ustawiłem początkową wartość wynik i też mi daje -4000 na typie long double, czyli rozumiem że to jakaś kwestia precyzji? Mogę coś zrobić żeby liczyło te cyfry po przecinku dokładniej?
komentarz 18 października 2020 przez overcq Pasjonat (22,630 p.)
Jest dostępny cpp_bin_float w boost, ale musiałoby być inne wypisywanie i wczytywanie wartości.

Podobne pytania

–1 głos
3 odpowiedzi 1,166 wizyt
pytanie zadane 30 maja 2021 w PHP przez KFC Użytkownik (610 p.)
0 głosów
1 odpowiedź 386 wizyt
pytanie zadane 2 listopada 2019 w C i C++ przez olka_a Nowicjusz (140 p.)

93,487 zapytań

142,420 odpowiedzi

322,772 komentarzy

62,903 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...