• 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

Object Storage Arubacloud
0 głosów
97 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 (21,650 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 (21,650 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 (21,650 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 646 wizyt
pytanie zadane 30 maja 2021 w PHP przez KFC Użytkownik (610 p.)
0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 2 listopada 2019 w C i C++ przez olka_a Nowicjusz (140 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...