Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1

Użytkownik


Witam
Napisałem sobie taki programik :
#include <iostream>
using namespace std;
int main()
{
int n,poz;
char bufor[10000];
float sum=0;
scanf("%d",&n);
for(int d=0;d<n;d++) // petla do sumowania
{
scanf("%s",bufor);
for(poz=0;poz<strlen(bufor);poz++)
if(bufor[poz]==',') bufor[poz]='.'; // zamiana "," na "."
sum+=atof(bufor);
}
sprintf(bufor,"%g",sum);
for(poz=0;poz<strlen(bufor);poz++)
if(bufor[poz]=='.') bufor[poz]=','; // zamiana wyniku z "." na ","
printf("%sn",bufor);
return 0;
}
ale sie okazuje ze jak podam np. :
2
-1,1
1,1
to nie dostane ZERA tylko -2.38419e-08(w C++) lub -3,43597e+09(jak przerobie na czyste C)
Czemu tak sie dzieje ?
Offline
Członek DUG

Stawiam na na bledy zaokraglen (liczba 1.1 nie jest dokladnie reprezentowana). Zamien typ zmiennej sum na double i bedzie dzialac.
Offline

Użytkownik


I masz racje
ale jak teraz podam :
2 1000000 1000000
to dostaje notacje naukową co zrobić zeby to działało tak jak chce ?
Do szału mnie to doprowadza...
Offline

Użytkownik


dobra czajcie to :
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
#include <iomanip>
int main()
{
std::string value_buffer;
double sum(0), int_part;
int n_iters, iter_idx;
std::cin >> n_iters;
if( n_iters <= 0 )return 0;
// Odczyt i sumowanie
for( iter_idx = 0; iter_idx < n_iters; iter_idx ++ )
{
std::cin >> value_buffer;
std::replace( value_buffer.begin(), value_buffer.end(), ',', '.' );
sum += atof( value_buffer.c_str() );
}
// Ladujemy w string stream (z formatowaniem) aby moc zmienic "." na ","
std::stringstream str_stream;
str_stream << std::dec << std::setprecision(12) << sum;
// Zamien "." na ","
std::string output_value( str_stream.str() );
std::replace( output_value.begin(), output_value.end(), '.', ',' );
// Drukuj wynik na ekran
std::cout << output_value << std::endl;
}
Jak można poprawić precyzje wyników ?
Offline

Członek DUG


Jak można poprawić precyzje wyników ?
Jesli nie zadowala Cie podwojna precyzja mozesz uzyc naukowych bibliotek gsl lub napisac swoja wlasna arytmetyke. Nic nie poradzimy na to ze reprezentacja nieskonczonego, nieprzeliczalnego zbioru liczb rzeczywistych jest w arytmetyce komputerowej przeksztalcana na skonczony i o ograniczonej precyzji zapis binarny.
Offline

Użytkownik


cóż zostawie z tym ograniczeniem :)
Dzieki za odpowiedź...
Offline

Użytkownik


Dostałem podpowiedź: "to jest proste -
dodajesz dwa stringi tak jak się uczyłeś na matematyce (cyferka po
cyferce z przeniesieniem) :)"
Może mi ktos powiedzieć co ta osoba ma na myśli ?
Offline

Członek DUG


To jest poprostu tworzenie wlasnej arytmetyki. Ktos proponuje bys przechowywal liczby w postaci stringow i je sumowal. Troche z tym bedzie zabawy ale jest to jakims rozwiazaniem.
Offline

Użytkownik


To jest poprostu tworzenie wlasnej arytmetyki. Ktos proponuje bys przechowywal liczby w postaci stringow i je sumowal. Troche z tym bedzie zabawy ale jest to jakims rozwiazaniem.
'
Właśnie, pomógłbyś zrobic ?
Offline

Członek DUG


Napisalem cos szybko. Zrobilem tylko dodawanie. Stringi maja okreslona dlugosc, zmiane tego pozostawiam juz Tobie. Nie sprawdzam zadnych warunkow typu czy jest wiecej kropek i takie tam. Program nie dziala dla liczb ujemnych. Ogolenie kod jest bardzo prowizoryczny.
#include <stdio.h>
#define MAX 100
#define DOT '.'
char *add(char *x, char *y);
int main() {
char x[MAX], y[MAX], *s;
printf("podaj pierwsza: ");
scanf("%s", x);
printf("podaj druga: ");
scanf("%s", y);
s = add(x, y);
if (s != NULL) {
printf(" %sn %snn%snn", x, y, s);
free(s);
}
return 0;
}
char *add(char *x, char *y) {
int dot1, dot2, len, dot, i;
char *c;
c = strchr(x, DOT);
if (c == NULL)
return NULL;
dot1 = strlen(x) - strlen(c);
c = strchr(y, DOT);
if (c == NULL)
return NULL;
dot2 = strlen(y) - strlen(c);
if (dot1 > dot2)
len = dot1;
else
len = dot2;
dot = len;
if (strlen(x) - dot1 > strlen(y) - dot2)
len += strlen(x) - dot1;
else
len += strlen(y) - dot2;
char a[len + 1], b[len + 1], *s;
s = (char *)malloc((len + 2) * sizeof(char));
if (s == NULL) {
fprintf(stderr, "nie zaalokowalem!n");
exit(1);
}
for (i = 0; i < len; i++) {
a[i] = '0';
b[i] = '0';
s[i] = '0';
}
a[len] = ' ';
b[len] = ' ';
s[len] = '0';
s[len + 1] = ' ';
int k = 0, l = 0;
for (i = 0; i < len; i++) {
if ((i + dot1 >= dot) && (k < strlen(x))) {
a[i] = x[k];
k++;
}
if ((i + dot2 >= dot) && (l < strlen(y))) {
b[i] = y[l];
l++;
}
}
int carry = 0;
char q;
for (i = len - 1; i >= 0; i--) {
if (i == dot) {
s[i + 1] = DOT;
continue;
}
q = a[i] + b[i] - '0' + carry;
if (q > '9') {
carry = 1;
q -= 10;
}
s[i + 1] = q;
}
if (carry != 0)
s[0] = '1';
return s;
}
Offline
Strony: 1