Na ez mi ?

Kezdőlap Fórumok Programozás Na ez mi ?

10 bejegyzés megtekintése - 21-30 / 33
  • Szerző
    Bejegyzés
  • #2010702
    ds
    Felhasználó

      Kösz, de evvel szerintem még nem oldódott meg a probléma, mivel c értéke kissé eltér a normálistól ( nem merem azt írni, hogy a végeredménytõl, mert manapság az már nem tudható biztosan :-)) ).
      Sajnos most én nem tudom kipróbálni az általam talált doksiban említett két módszert:
      1)

      #2010703
      Micsoda
      Felhasználó

        Az én megoldásom:

        Code:
        int main(int argc, char * argv[]) {

        long double a,b,c;
        a=65.13;
        b=21160;
        c=a*b;
        printf („a=%Lf, b=%Lf, c=%Lf, a*b=%Lf „,a,b,c,(a*b));
        if((long double)(a*b)!=c)
        printf(„nMost hibáztam!na:t%L4.4fnb:t%L4.4fnc:t%L4.4fna*b:t%L4.4dnn”,a,b,c,(a*b));
        else
        printf(„nMost eltaláltam!na:t%Lfnb:t%Lfnc:t%Lfnn”,a,b,c);
        return 0;
        }

        gabor@ubuntu:/mnt/uhuhomehda3/gabor $ ./teszt
        a=65.130000, b=21160.000000, c=1378150.800000, a*b=1378150.800000
        Most eltal

        #2010704
        Micsoda
        Felhasználó

          most akkor normális eredmény kell vagy összehasonlítás??? 🙂
          (amugy ne hasonlíts össze =-vel double vagy float számokat, ahogy a man és a doksi is írja)
          [align=right][snapback]126905[/snapback][/align]

          Akkor hogyan ?
          Mivel az alapproblémám az volt, hogy az értékek egy adattáblába kerülnek, ahova be van téve egy automatikus ellenõrzés, hogy a*b egyenlõ-e c-vel.
          Az összehasonlítást és az értékkezelést sem lehet kikerülni, mind a kettõre szükség van.

          #2010705
          ds
          Felhasználó

            Akkor hogyan ?
            Mivel az alapproblémám az volt, hogy az értékek egy adattáblába kerülnek, ahova be van téve egy automatikus ellenõrzés, hogy a*b egyenlõ-e c-vel.
            Az összehasonlítást és az értékkezelést sem lehet kikerülni, mind a kettõre szükség van.
            [align=right][snapback]126907[/snapback][/align]

            abs(a*b-amineklenniekell)<1e-4

            Code:
            main() {

            long double a,b,c;

            a=65.14;
            b=21160.0;
            c=a*b;

            if((a*b)!=c)

            printf(„nMost hibaztam!na:t%40.30Lgnb:t%40.30Lgnc:t%40.30Lgna*b:t%40.30Lgnn”,a,b,c,(a*b));
            else
            printf(„nMost eltalaltam!na:t%40.30Lgnb:t%40.30Lgnc:t%40.30Lgna*b:t%40.30Lgn”,a,b,c,(a*b));
            }

            Most eltalaltam!
            a: 65.1400000000000005684341886081
            b: 21160
            c: 1378362.40000000001202806743095
            a*b: 1378362.40000000001202806743095

            long nélkül pedig:

            Most hibaztam!
            a: 65.1400000000000005684341886081
            b: 21160
            c: 1378362.39999999990686774253845
            a*b: 1378362.39999999990686774253845

            csak hogy érdekes legyen! 🙂

            #2010706
            Leslieman
            Felhasználó

              Na pont ezt akartam épp javasolni! Mármint, hogy állítsd át a tizedes pont utáni kijelzett digitek számát, és egybõl látványosabb a dolog.
              Magamnál kipróbáltam.

              #2010707
              Micsoda
              Felhasználó

                Na pont ezt akartam épp javasolni! Mármint, hogy állítsd át a tizedes pont utáni kijelzett digitek számát, és egybõl látványosabb a dolog.
                Magamnál kipróbáltam.
                [align=right][snapback]126924[/snapback][/align]

                Ez akkor OK, kösz mindenkinek.
                Viszont az adattáblával még mindig harcolok, nem akar összejönni két float típus ( adatbázis float ) szorzatának értékelése. Esetleg ha van valaki aki ebbe bele tud szólni ? Jelenleg talán a float(4) valamilyen megoldást ad, de igazán nem tudom ez meddig „tart”.

                #2010708
                Micsoda
                Felhasználó

                  Ha valakit érdekel: mellékelem a fentiekben említett doksi szerzõjének levelét ( írtam neki ):
                  „…
                  Yes, your program illustrates the same issue that was discussed in linux_numerics.txt on the web site. The program runs correctly under FreeBSD and 64-bit linux (Red Hat Enterprise 3 AMD64 version), but gives the wrong result when compiled for 32 bits under Red Hat Enterprise and almost certainly all other 32-bit Linux distributions.

                  Here’s a version that runs correctly in 32-bits:


                  #ifdef __linux
                  #include
                  #endif

                  int main(int argc, char * argv[]) {

                  double a,b,c;

                  #ifdef __linux
                  // This puts the X86 FPU in 64-bit precision mode. The default under
                  // Linux is to use 80-bit mode, which produces subtle differences from
                  // FreeBSD and other systems, eg, (int)(1000*atof(„0.3”)) is 300 in
                  // 64-bit mode, 299 in 80-bit mode.
                  fpu_control_t cw;
                  _FPU_GETCW(cw);
                  cw &= ~_FPU_EXTENDED;
                  cw |= _FPU_DOUBLE;
                  _FPU_SETCW(cw);
                  #endif

                  a=65.13;

                  b=21160;

                  c=a*b;

                  printf („a=%lf, b=%lf, c=%lf, a*b=%lf „,a,b,c,(a*b));

                  if((a*b)!=c)

                  printf(„nWrong result!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a
                  ,b,c,(a*b));

                  else

                  printf(„nGood result!na:t%1fnb:t%1fnc:t%1fnn”,a,b,c);

                  return 0;

                  }



                  Regards,

                  Steve Whiteley

                  …”

                  #2010709
                  redlock
                  Felhasználó

                    próbáld ki azt:
                    double helyett unsigned double
                    nekem ugy sikerult

                    #2010710
                    uzsolt
                    Felhasználó

                      uzsolt: erre tudnál példát hozni? Elég meredeken hangzik, hogy a szorzás nem mindig
                      kommutatív  :ph34r:
                      [align=right][snapback]126888[/snapback][/align]

                      Lehet, hogy speciel szorzásra nem tudok, de próbáld ki a következõt egy számológéppel:
                      10^20+3-10^20-2
                      és persze permutáld (változtasd) a sorrendet. Szinte minden változatra más-más eredmény fog kijönni. Lehet, hogy szorzásra is lehet valami hasonlót kreálni. Ja, szerintem számítógéppel se „kommutatív” az összeadás (már persze nem maple, maxima meg egyéb computer-algebrai progival).

                      Az eredeti problémához: úgy látom, lassan megoldódik. Egyébként javaslom, hogy sok (kb. 10) tizedesjegy pontossággal legyenek kiírva a számok, nagy meglepetések érhetik az embert 🙂

                      #2010711
                      okoska
                      Felhasználó

                        Az en probalkozasom Slackware 10 alatt:

                        Code:
                        #include

                        int main(int argc, char * argv[])
                        {
                        double a,b,c;
                        a=65,14;
                        b=21160;
                        c=a*b;

                        if (c!=a*b)
                        {
                        printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));
                        }
                        else
                        {
                        printf(„nMost eltaláltam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));
                        }
                        return(0);
                        }

                        utf kodolasra van allitva a rendszerem. Nem tudom, hogy ezert vagy masert de nalam egy tizedes pont helyett egy vesszo megoldotta.
                        gcc version 3.3.4

                      10 bejegyzés megtekintése - 21-30 / 33
                      • Be kell jelentkezni a hozzászóláshoz.