Kezdőoldal » Számítástechnika » Programozás » Visual C++ alatt elérhető...

Visual C++ alatt elérhető valahogy az FPR regiszterek mind a 80 bitje x64-en?

Figyelt kérdés

80 bites lebegőpontos számításokra lenne szükségem, de úgy tűnik hogy a long double típus csak egy aliasa a double típusnak Visual C++ alatt, és nem használja ki az FPU teljes kapacitását. Minden más ismert fordítóban a long double 80-bites pontosságot jelöl!


Próbáltam inline assemblerrel elérni az FPR/MMX regisztereket, de úgy tűnik hogy a Visual C++ 64 biten nem támogatja még az inline assemblyt se.


Tényleg ennyire rossz lenne az oly sokak által használt és fényezett VC++? (linuxos vagyok, nem sokat találkozok vele) Szégyen szemre a programom egy részét gcc-vel kell fordítanom, vagy van valami megoldás arra hogy ki tudjam használni hardveresen a 80-bit floatot a fordítón belül? Esetleg valaki tudja hogy miért nem támogatja az inline assembly-t és a 80-bites floatot a VC++? Számomra ennek semmi értelme.


A projekt nem kompatibilis a gcc-vel, és nincs lehetőségem átalakítani se..



#Visual C++ #FPU #inline assembly
2016. febr. 4. 04:05
 1/7 anonim ***** válasza:
Innentől csak a memória szab határt: [link]
2016. febr. 4. 06:12
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:
Kösz, megnéztem de semmilyen szempontból sem felel meg a leírtaknak. Úgy tűnik a Boost könyvtár nem támogatja a 80-bitet float pontosságot hardveresen. Csak egy egyszerű szoftveres kiterjesztése a hardveres megoldásoknak, ha nem lenne elég az FPR regiszterek 80 bitje (a long double-t ők is alapvető típusnak tartják). Amúgy sem értem hogy egyetlen egy funkcióért miért kéne egy több száz megás könyvtárat betölteni egy sebességkritikus alkalmazásba.
2016. febr. 4. 12:56
 3/7 anonim ***** válasza:

Az eredeti kérdésre a válasz: nem. Inline assemblyvel sem (csak 32 biten). Hogy miért? Kérdezd a Micro$oftot.

(egyébként mihez kell 80, és nem elég a 64? csak kíváncsiságból)

2016. febr. 4. 14:31
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

"Amúgy sem értem hogy egyetlen egy funkcióért miért kéne egy több száz megás könyvtárat betölteni egy sebességkritikus alkalmazásba."


Nem ismerem a vc plus-plust, de miért nem írod meg assemblyben a függvényt és linkeled össze? (.obj)

2016. febr. 4. 17:40
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:
High Level Assembly. De ha a ringyóz védelme nem támogatja az utasítást, vagy nem engedi a regiszterhez való hozzáférést, akkor sorry..
2016. febr. 4. 17:44
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:
"Azáltal, hogy valamennyi számítást 80 bitet használva végez, az Intel segít biztosítani (de nem garantálja) hogy elérjük a teljes 32-bites vagy 64-bites pontosságot számításainkban. Mivel az FPU nem tud nagyszámú őrbitet biztosítani a 80-bites számításokban, valamennyi hiba biztosan becsúszik a kiterjesztett pontosságú számítások alacsony helyértékű bitjeibe. Ha azonban számításunk 64 bitre helyes, a 80-bites számítás mindig legalább 64 pontos bitet biztosít; legtöbbször ennél többet. Bár azt nem tételezhetjük fel, hogy 80-bites pontosságú számítási eredményt kapunk, az eredményünk 64-bitesnél biztosan jobb lesz, amikor kiterjesztett pontosságú formátumot használunk."
2016. febr. 4. 17:48
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

"Nem ismerem a vc plus-plust, de miért nem írod meg assemblyben a függvényt és linkeled össze? (.obj)"


Minden egyes függvényt ami használná az x87 utasításkészletet assemblyben írjam meg? A C++ kódban egy makróval ki tudtam volna cserélni a long double használatát egy ASM utasításra, de hogy minden függvényt írjak meg assemblyben annak nincs értelme. Arra ott van akkor a gcc és akkor azzal fordítom a megfelelő forrásfájlokat, minek ide assembly? Vagy arra gondolsz hogy csináljak valami getter setter függvényt és azt hívogassam? Az overhead miatt már érné meg az FPU használata.


Pont azt szeretném elkerülni hogy különböző fordítókkal keljen fordítani a programot minden egyes alkalommal hogy módosítok rajta, de lehet hogy az lesz a vége egy kis átszervezéssel...


"High Level Assembly."


Nekem tökéletesen megfelelne a NASM, TASM, YASM meg a társai, ismerem az x64 assembly-t. De megint csak ott a gcc helyettük.


"Azáltal, hogy valamennyi számítást 80 bitet használva végez, az Intel segít biztosítani (de nem garantálja) hogy elérjük a teljes 32-bites vagy 64-bites pontosságot számításainkban."


Ez így van, nekem meg van egy hibaküszöböm aminél nagyobb hibát nem engedhetek meg a rendszer stabil működéséhez. Sajnos nem én találtam ki, ezek a követelmények.


A teljesség kedvéért a 64 bites double 53 bitnyi pontosságot biztosít, a 32 bites float pedig 24-et, feltéve ha az IEEE 754 szabvány szerint tároljuk.


#3 Sajnos az StackOverflow-n is hasonló választ találtam, nincs rá lehetőség. Microsoft $ux és nem érdekli őket a C/C++ szabvány, a fordítójuk pedig erősen hiányos. Nem tudom kinek az ötlete volt anno hogy a projektet VC++-szal írja de mostanában jó nagyokat szívok miatta :)


Kösz a válaszokat.

2016. febr. 4. 18:10

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!