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
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
Stawiam na na bledy zaokraglen (liczba 1.1 nie jest dokladnie reprezentowana). Zamien typ zmiennej sum na double i bedzie dzialac.
Offline
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
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
Jak można poprawić precyzje wyników ?[/quote]
Jesli nie zadowala Cie podwojna precyzja mozesz uzyc naukowych bibliotek [url=http://www.gnu.org/software/gsl/manual/html_node/]gsl[/url] 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.
apt-get install anarchism
Offline
cóż zostawie z tym ograniczeniem :)
Dzieki za odpowiedź...
Offline
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
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
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.[/quote]'
Właśnie, pomógłbyś zrobic ?
[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]
Offline
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
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00006 | SET NAMES latin2 |
0.00113 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.59.244' WHERE u.id=1 |
0.00077 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.59.244', 1732597740) |
0.00052 | SELECT * FROM punbb_online WHERE logged<1732597440 |
0.00085 | DELETE FROM punbb_online WHERE ident='3.137.178.122' |
0.00039 | SELECT topic_id FROM punbb_posts WHERE id=48996 |
0.00164 | SELECT id FROM punbb_posts WHERE topic_id=6390 ORDER BY posted |
0.00051 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=6390 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00065 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=6390 ORDER BY p.id LIMIT 0,25 |
0.00103 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=6390 |
Total query time: 0.00773 s |