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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2007-01-07 09:57:49

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Czemu mi daje taki wynik sumownik w c/c++

Witam
Napisałem sobie taki programik :

Kod:

#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 ?


[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]

Offline

 

#2  2007-01-07 12:04:40

  tomek - Członek DUG

tomek
Członek DUG
Skąd: Wroclaw
Zarejestrowany: 2006-10-20

Re: Czemu mi daje taki wynik sumownik w c/c++

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

Offline

 

#3  2007-01-07 19:20:14

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Re: Czemu mi daje taki wynik sumownik w c/c++

I masz racje
ale jak teraz podam :

Kod:

2
1000000
1000000

to dostaje notacje naukową co zrobić zeby to działało tak jak chce ?
Do szału mnie to doprowadza...


[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]

Offline

 

#4  2007-01-08 19:34:40

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Re: Czemu mi daje taki wynik sumownik w c/c++

dobra czajcie to :

Kod:

#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 ?


[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]

Offline

 

#5  2007-01-08 21:39:46

  0dd - Członek DUG

0dd
Członek DUG
Skąd: Kraków
Zarejestrowany: 2006-03-25

Re: Czemu mi daje taki wynik sumownik w c/c++

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

 

#6  2007-01-09 11:23:10

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Re: Czemu mi daje taki wynik sumownik w c/c++

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


[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]

Offline

 

#7  2007-01-09 23:25:04

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Re: Czemu mi daje taki wynik sumownik w c/c++

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 ?


[url=http://www.djlinux.xt.pl]Wojciech Stępniak[/url]

Offline

 

#8  2007-01-10 08:08:25

  0dd - Członek DUG

0dd
Członek DUG
Skąd: Kraków
Zarejestrowany: 2006-03-25

Re: Czemu mi daje taki wynik sumownik w c/c++

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.


apt-get install anarchism

Offline

 

#9  2007-01-10 11:31:13

  djlinux1992 - Użytkownik

djlinux1992
Użytkownik
Skąd: Zamość
Zarejestrowany: 2005-05-22

Re: Czemu mi daje taki wynik sumownik w c/c++

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

 

#10  2007-01-10 20:30:23

  0dd - Członek DUG

0dd
Członek DUG
Skąd: Kraków
Zarejestrowany: 2006-03-25

Re: Czemu mi daje taki wynik sumownik w c/c++

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.

Kod:

#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;
}

apt-get install anarchism

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.013 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00011 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00111 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='18.219.121.255' WHERE u.id=1
0.00115 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.219.121.255', 1715795244)
0.00061 SELECT * FROM punbb_online WHERE logged<1715794944
0.00103 SELECT topic_id FROM punbb_posts WHERE id=49351
0.00263 SELECT id FROM punbb_posts WHERE topic_id=6390 ORDER BY posted
0.00122 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.00008 SELECT search_for, replace_with FROM punbb_censoring
0.00142 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.00117 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=6390
Total query time: 0.01057 s