🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #313

Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)

#313
From: Bogdan (bogdro)
Date: Mon, 05 Jun 2006 14:37
39 lines
2936 bytes
Jareq napisał(a):
> Witam,
> 
> Napisałem program hybrydowy (C + assembler) i po pewnych wyliczeniach
> otrzymuje liczbe zmiennoprzecinkową na ST(0). Chcę ją przekazać do
> modułu w C++ do zmiennej typu double. Wszystko generalnie (tylko
> generalnie) jest ok, ale jesli liczba nie miesci sie na 64 bitach to
> oczywiscie wystepuje w module C overflow - nie da sie przedstawic liczby
> na zmiennej double.
> 
> Postanowilem wiec ze zamienie liczbe ze stosu (czyli zapisana na 80
> bitach) na double (czyli 64 bity). Okazuje sie ze nie jest to (dla mnie)
> takie proste. Czy spotkal sie ktos kiedys z tym problemem?
> 
> Czy jest jakis sposob zeby najpierw sprawdzic czy taka liczba da sie
> przedstawic na 64 bitach? Zaznacze, ze chce to zrobic w module
> asemblerowym (wiec porownywanie do DBL_MAX w module c++ odpada -
> aczkolwiek jest to jakies rozwiazanie).

 Wyłuskaj wartość DBL_MAX, zapisz ją na stałe w kodzie asm (od razu
jako DT, w końcu to jest stała), załaduj na stos FPU, wykonaj FCOMIP i
jesteś w domu :) (wystarczy sprawdzić wartość flag).

> Najlepiej gdyby w module asemblerowym liczba ze stosu koprocesora byla
> przenoszona do jakiejs zmiennej QWORD z konwersja (no i jakos zeby dalo
> sie sprawdzic czy jest to w ogole mozliwe - wtedy ustawie sobie flage,
> czy zmienna i sprawdze ja w module C++ - jesli bedzie zero to znaczy ze
> liczba moze byc zapisana do zmiennej tylu double, jesli nie to znaczy ze
> otrzymalismy za duzy wynik).

 Więcej roboty będzie niż w powyższym sposobie. Możesz po prostu
zapisać st0 do zmiennej qword, po czym sprawdź status FPU, czy nie
wystąpił wyjątek, wyłączając uprzednio sygnalizowanie wyjątków.

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Prawdziwy, bezpieczny komunikator:                   www.JabberPL.org
Technical Details
Message-ID: <e61fnd$214$1@nemesis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <e6198o$2l7$1@node1.news.atman.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: "Bogdan (bogdro)" <bogdan@bogdan.pl>
Newsgroups: pl.comp.lang.asm
Subject: Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real   (64bity)
Date: Mon, 05 Jun 2006 16:37:28 +0200
Organization: tp.internet - http://www.tpi.pl/
Lines: 39
Message-ID: <e61fnd$214$1@nemesis.news.tpi.pl>
References: <e6198o$2l7$1@node1.news.atman.pl>
NNTP-Posting-Host: acsr48.neoplus.adsl.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1149518382 2084 83.11.45.48 (5 Jun 2006 14:39:42 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Mon, 5 Jun 2006 14:39:42 +0000 (UTC)
User-Agent: Thunderbird 1.5.0.4 (X11/20060516)
In-Reply-To: <e6198o$2l7$1@node1.news.atman.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit