Na ez mi ?

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

10 bejegyzés megtekintése - 1-10 / 33
  • Szerző
    Bejegyzés
  • #2010682
    Micsoda
    Felhasználó

      Nem jön ki az eredmény.

      #2010683
      kelemengabor
      Felhasználó

        Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.

        szerk: kipróbáltam az eredetit, nekem ez jött ki:
        EXECUTING:
        /home/gabor/teszt



        Most eltal

        #2010684
        Micsoda
        Felhasználó

          Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.
          [align=right][snapback]126866[/snapback][/align]

          Kösz, valami hasonló sejtésem volt, de tovább gombolyítva a kérdést:
          ha van egy adatbázis, amibe bedolgzol és az adattáblába be van állítva az, hogy egy mezõ értéke = két másik mezõ szorzatával, akkor mi a helyzet. Mert így a tábla mindig vissza fogja utasítani a bevitelt, ha bármelyik mezõ értéke törtszám.

          Addig eljutottam, hogy az adattábla „sok” tört szorzatát elfogadja, de van egy mágikus szám: 65.13 * 21160; ezt az istenért nem veszi be.

          Csak bízok benne, hogy van valami más trivi megoldás is.

          #2010685
          Micsoda
          Felhasználó

            Ez a számábrázolás hibája lesz, valószínûleg. Olyasmi, mint amikor összeadsz zsebszámológéppel 1/3-ot (0,333333…) + 2/3-ot (0,666666…) az eredmény 0,999999… lesz és nem 1 (jobb esetben persze kerekít, és a 2/3-ad utolsó jegye 7, de régebbi/egyszerûbb típusok nem). Lebegõpontos mennyiségeket épp ezért nem így kell összehasonlítani, hanem megnézni, hogy a várt értéktõl való különbsége kisebb-e egy tetszõlegesen kicsi (pl. 10E-7 nagyságrendû) epszilontól. Ha igen, a két érték azonosnak tekinthetõ. Azaz pl. if ((a*B)-c)<10E-7) esetén már valószínûleg el fogja találni a progi.
            szerk: kipróbáltam az eredetit, nekem ez jött ki:
            EXECUTING:
            /home/gabor/teszt



            Most eltal

            #2010686
            kelemengabor
            Felhasználó

              Nekem nem jön ki, mindig hibát jelez.
              De nem csak ez, hanem az ezen alapuló mûveletek mind. Pl. adatbázismûvlet fent.
              Vagyis nem igazán tudom mi van….
              Lehet hogy ez hardverfüggõ ? VagyOS: Enyém: Mandrake 10.1.
              [align=right][snapback]126869[/snapback][/align]

              Ez nekem uhu 1.2 alatt van, 3.3.4-es gcc-vel. Hogy hardverfüggõ, az nem valószínû, de nem tudom, mi lehet. Adattáblákhoz (sql) meg nem értek, szóval ezt a részét passzolom. Nálad mi a program kimenete?

              #2010687
              Micsoda
              Felhasználó

                Ez nekem uhu 1.2 alatt van, 3.3.4-es gcc-vel. Hogy hardverfüggõ, az nem valószínû, de nem tudom, mi lehet. Adattáblákhoz (sql) meg nem értek, szóval ezt a részét passzolom. Nálad mi a program kimenete?
                [align=right][snapback]126872[/snapback][/align]

                Az, hogy Most hibáztam, tehát az a*b != c.
                Hiba nincs.

                #2010688
                Morzel
                Felhasználó

                  Sajnos nem jön ki az eredmény! Mi a hiba ebben ?

                  main() {

                  double a,b,c;

                  a=65.14;
                  b=21160;
                  c=a*b;

                  if((a*B)!=c)

                  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.4fnn”,a,b,c);
                  }
                  [align=right][snapback]126859[/snapback][/align]

                  Udv!

                  Code:
                  printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));

                  szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
                  Ha hulyeseget mondok, szoljatok.

                  Morzel

                  #2010689
                  Micsoda
                  Felhasználó

                    Udv!

                    Code:
                    printf(„nMost hibáztam!na:t%14.4fnb:t%14.4fnc:t%14.4fna*b:t%14.4fnn”,a,b,c,(a*b));

                    szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
                    Ha hulyeseget mondok, szoljatok.

                    Morzel
                    [align=right][snapback]126874[/snapback][/align]

                    Szerintem itt nem lehet hülyeséget mondani amíg a megoldás nincs meg.
                    Az tény, ha két egész számmal végezzük a mûveletet akkor minden OK, viszont ha belép egy tört akkor van a hiba.

                    #2010690
                    Leslieman
                    Felhasználó

                      szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
                      Ha hulyeseget mondok, szoljatok.

                      Szerintem a c/c++ ezt inkább double-á konvertálja, mivel az ‘a’ változó olyan típusú (és a kiértékelési sorrend miatt).
                      A hiba tényleg a számábrázolásból adódik, és platform (mármint pl intel/motorola) és valószínûleg fordító függõ is. 🙂

                      #2010691
                      kelemengabor
                      Felhasználó

                        Udv!

                        szerintem a (a*B) kifejezes problemas. Ugyanis b=21160 (int). Nem lehet, hogy a kifejezest atkonvertalja int-re?
                        Ha hulyeseget mondok, szoljatok.

                        Morzel
                        [align=right][snapback]126874[/snapback][/align]

                        A b-t double-nak deklarálta, tehát nem int. Az a*b is double, mivel mindkettõ az, szerintem nem ez a gond. Viszont, amikor nem találja el, az értékek ugyanazok, mint ami nekem jött ki?

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