Kezdőoldal » Számítástechnika » Programozás » C++-ban érdemes az alapból...

C++-ban érdemes az alapból megadott függvényeket használni, vagy gyorsabb, ha sajátot készítünk?

Figyelt kérdés

Pl. érdemes saját abs(), sqrt(), pow() függvényeket csinálni, hogy gyorsabban lefussanak?


És négyzetre emelésnél érdemesebb kétszer összeszorozni magát a számot, mint függvényt használni?


Sebesség illetve méret tekintetében kérdezem.


2020. aug. 7. 18:20
1 2
 1/18 anonim ***** válasza:
20%

A beépített mindig jobb, az optimalizálva van.

A négyzetre emelésnél azért két szorzás gyorsabb, mert egy függvényhívásnak mindig érezhető költsége van.

2020. aug. 7. 18:22
Hasznos számodra ez a válasz?
 2/18 anonim ***** válasza:

Neked kell tudnod, hogy érdemes-e energiát befektetni, az mindenesetre tévedés, hogy a beépített függvények (úgy általánosságban) jobbak lennének.

Néhány esetben meg kifejezetten hulladékok. Nem c++-ról beszélek, hanem úgy általánosságban.

2020. aug. 7. 18:57
Hasznos számodra ez a válasz?
 3/18 anonim ***** válasza:
A négyzetre emeléshez szólnék hozzá: nem csak C++-ban hanem a legtöbb nyelv esetén érdemes a két tényező szorzását használni. Egyszer végig teszteltünk talán 30 nyelvet egy rakás fordítóval,és legtöbb esetén a hatványozást "általános" alakban vette és negatív számnak nem engedte meg a négyzetre emelését.
2020. aug. 7. 19:01
Hasznos számodra ez a válasz?
 4/18 anonim ***** válasza:
0%

"A négyzetre emelésnél azért két szorzás gyorsabb, mert egy függvényhívásnak mindig érezhető költsége van."


C++ban nem. Mivel a szorzás az operator* függvény. Tehát a pow sokkal gyorsabb.

2020. aug. 7. 19:03
Hasznos számodra ez a válasz?
 5/18 anonim ***** válasza:
0%

"nem csak C++-ban hanem a legtöbb nyelv esetén érdemes a két tényező szorzását használni."


Neked is ugyanazt tudom mondani. A szorzás is egy függvény semmivel sem jobb vagy gyorsabb. Ha négyzetre emelsz használd a pow() függvényt.

2020. aug. 7. 19:05
Hasznos számodra ez a válasz?
 6/18 anonim ***** válasza:
76%

A szorzás nem függvény.

a négyzetre emelés meg nem is biztos, hogy szorzás lesz.

2020. aug. 7. 19:12
Hasznos számodra ez a válasz?
 7/18 anonim ***** válasza:
0%
C++ minden operátor függvény. A szorzás is egy operátor. Gondolom soha életedben nem foglalkoztál C++-al. Nem is értem miért próbálsz hozzászólni vagy olyat állítani, ami nem igaz. Azért tudsz C++ ban operator overload-ot csinálni, mert mindegyik operátor függvény. Tehát ha kif1 * kif2 akkor is egy függvény hívódik meg. operator*(kif1,kif2) ugyanaz.
2020. aug. 7. 19:18
Hasznos számodra ez a válasz?
 8/18 anonim ***** válasza:
32%

Én készséggel elfogadom amit mondasz, de megtennéd, hogy egy szimpla szorzást (mondjuk 4 x 4) kigeneráltatsz a fordítóddal, o2-n .asm kimenetre?

Nálam nincs fent cpp fordító. Segítségedet előre is köszönöm.

2020. aug. 7. 19:22
Hasznos számodra ez a válasz?
 9/18 anonim ***** válasza:
0%
Nem kell készséggel elfogadnod, elég ha a cpp dokumentációját böngészed. Amúgy meg a pow() inline assemblybe van megírva. Gyorsabb lesz.
2020. aug. 7. 19:25
Hasznos számodra ez a válasz?
 10/18 anonim ***** válasza:

" A szorzás is egy függvény semmivel sem jobb vagy gyorsabb."


Ennek ellenkezőjét nem állítottam. Nem a szorzás függvénységéről és implementálásáról és a sebességről sem beszéltem. Annyit írtam, hogy az esetek jelentős részében a szorzás és a hatványozás más eljárással dolgozik. Ennek eredménye, hogy más az értelmezési tartománya is. Az, hogy a pow() végez egy ellenőrzést, hogy egész kitevős-e a hatvány (pl. ez eddig elkerülte a figyelmemet, ésezért elnézést kérek, most elolvastam még 1x a részletes doksit) az meg biztosan lassítja a végrehajtást. Arra most nem találtam semmit, hogy hogyan van implementálva a pow() de én innen biztos vagyok benne, hogy biztos, hogy gyorsabb lesz a szorzás.

Ugyanígy az eredmény pontossága is kérdéses még. A két tényező szorzása esetén nem kell külön kutakodni, hogy mennyire lesz pontos az eredmény. Ha a hatványozást használja az ember akkor utána kell nézni, hogy melyik közelítő eljárást használjak.


A legegyszerűbb az a^b=e^(b*ln(a)) forma, de találkoztam már (nem C++ esetén,mert ott nem mentem bele ennyire mélyen) 2^(b*log2(a)) megoldással is. Innen meg a kérdés, az e^x illetve a 2^x valamint a hozzá tartozó logaritmálás pontossága. Tudom nem mindenkit zavar ha a 13. 14. tizedes jegy környékén van már komoly eltérés, de nem egy esetben láttunk ennél nagyobb hibákat is (már nem emlékszem melyik rendszernél találtunk egy olyat, hogy a hatványozás csak 8 jegy pontos volt, míg általában 14 jegy pontos volt az aritmetika). /Tudom a kérdező a sebességet és a méretet kérdezte, de a hiba is fontos szempont lehet/. Nyilván a double (64 bit) és long double (80/96 bit). A float kb. 7 jegy pontos, a double 14. Jó matekozást kiszámolni a logaritmálás és az e^x hibáját ez esetben, de mindenképpen nagyobb lesz mint a kettős szorzás. Nyilván ha nem négyzetre emelésről van szó akkor más a helyzet, mert ott úgyse tudunk mást kitalálni.

2020. aug. 7. 19:38
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!