🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
14 messages
14 total messages Started by Damian 'legion' Szuberski Wed, 02 May 2007 20:46
FPU i zaokrąglanie
#1099
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 20:46
10 lines
1091 bytes
Witam.

Wykonuję kilka operacji zmiennoprzecinkowych i chciałbym wynik
zaokrąglić do 2 miejsc po przecinku metodą "do najbliższego". W jaki
sposób mógłbym to zrobić? Szukałem w Google jednak nie znalazłem żadnych
konkretów poza sposobem na ustawienie stylu zaokrąglania.
Z góry serdecznie dziękuję za pomoc.

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1100
Author: Lopez
Date: Wed, 02 May 2007 22:41
17 lines
1366 bytes
Damian 'legion' Szuberski napisał(a):
> Witam.
> 
> Wykonuję kilka operacji zmiennoprzecinkowych i chciałbym wynik
> zaokrąglić do 2 miejsc po przecinku metodą "do najbliższego". W jaki
> sposób mógłbym to zrobić? Szukałem w Google jednak nie znalazłem żadnych
> konkretów poza sposobem na ustawienie stylu zaokrąglania.
> Z góry serdecznie dziękuję za pomoc.
> 

A co to za metoda "do najbliższego"?
Możesz np. pomnożyć przez 100, zaokrąglić do liczby
całkowitej (OIDP. frndint), a potem podzielić przez 100.

-- 
Pozdrawiam
Lopez
Re: FPU i zaokrąglanie
#1101
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 22:46
13 lines
1282 bytes
On 2007-05-02, Lopez wrote:
> A co to za metoda "do najbliższego"?
> Możesz np. pomnożyć przez 100, zaokrąglić do liczby
> całkowitej (OIDP. frndint), a potem podzielić przez 100.
4,344 -> 4,34
4,345 -> 4,35

Czy asm nie dostarcza narzędzi w kwestii zaokrąglania? Po co w takim
razie w rejestrach kontrolnych (?) FPU bity 10-11 odpowiedzialne za
zaokrąglanie?

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1102
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 23:56
29 lines
1618 bytes
On 2007-05-02, Lopez wrote:
> A co to za metoda "do najbliższego"?
> Możesz np. pomnożyć przez 100, zaokrąglić do liczby
> całkowitej (OIDP. frndint), a potem podzielić przez 100.
4,344 -> 4,34
4,345 -> 4,35

Wypróbowałem i chyba coś nie działa... Wklejam kod (pisane jako
wstawka do C):

#v+
// %2 - to zmienna z liczbą 100
// %0 - wynik
// liczba do zaokrąglenia znajduje się już na stosie
fimul %2
frndint
fild %2
fdivrp
fst %0
#v-

Kiedy nie robię żadnego zaokrąglania wynikiem jest 66.3000030517578125
Kiedy zaokrąglam ale nie dzielę przez 100 - 6630.00 (prawidłowo)
Kiedy zaokrąglam i dzielę przez 100 dostaję z powrotem
66.3000030517578125... :/
Nie bardzo wiem jak to wytłumaczyć.

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1103
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 23:58
28 lines
1611 bytes
On 2007-05-02, Lopez wrote:
> A co to za metoda "do najbliższego"?
> Możesz np. pomnożyć przez 100, zaokrąglić do liczby
> całkowitej (OIDP. frndint), a potem podzielić przez 100.
4,344 -> 4,34
4,345 -> 4,35

Wypróbowałem i chyba coś nie działa... Wklejam kod (pisane jako
wstawka do C):

#v+
// %2 - to zmienna z liczbą 100
// %0 - wynik
// liczba do zaokrąglenia znajduje się już na stosie
fimul %2
frndint
fidiv %2
fst %0
#v-

Kiedy nie robię żadnego zaokrąglania wynikiem jest 66.3000030517578125
Kiedy zaokrąglam ale nie dzielę przez 100 - 6630.00 (prawidłowo)
Kiedy zaokrąglam i dzielę przez 100 dostaję z powrotem
66.3000030517578125... :/
Nie bardzo wiem jak to wytłumaczyć.

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1104
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 00:03
34 lines
1734 bytes
On 2007-05-02, Lopez wrote:
> A co to za metoda "do najbliższego"?
> Możesz np. pomnożyć przez 100, zaokrąglić do liczby
> całkowitej (OIDP. frndint), a potem podzielić przez 100.
4,344 -> 4,34
4,345 -> 4,35

Wypróbowałem i chyba coś nie działa... Wklejam kod (pisane jako
wstawka do C):

#v+
// %2 - to zmienna z liczbą 100
// %0 - wynik
// liczba do zaokrąglenia znajduje się już na stosie
fimul %2
frndint
fidiv %2
fst %0
#v-

Kiedy nie robię żadnego zaokrąglania wynikiem jest 66.3000030517578125
Kiedy zaokrąglam ale nie dzielę przez 100 - 6630.00 (prawidłowo)
Kiedy zaokrąglam i dzielę przez 100 dostaję z powrotem
66.3000030517578125... :/

Dla innych danych jest to odpowiednio:
73.09999847412109375
7310.00
73.09999847412109375

Nie bardzo wiem jak to wytłumaczyć. Gdzie może tkwić błąd?

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1105
Author: Bernard
Date: Thu, 03 May 2007 07:29
15 lines
1430 bytes
Damian 'legion' Szuberski wrote:
> Kiedy nie robię żadnego zaokrąglania wynikiem jest 66.3000030517578125
> Kiedy zaokrąglam ale nie dzielę przez 100 - 6630.00 (prawidłowo)
> Kiedy zaokrąglam i dzielę przez 100 dostaję z powrotem
> 66.3000030517578125... :/
> 
> Dla innych danych jest to odpowiednio:
> 73.09999847412109375
> 7310.00
> 73.09999847412109375
> 
> Nie bardzo wiem jak to wytłumaczyć. Gdzie może tkwić błąd?

Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
natury przybliżony, a błędu zapewne nie ma nigdzie.
Re: FPU i zaokrąglanie
#1106
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 10:19
21 lines
1784 bytes
On 2007-05-03, Bernard wrote:
>> Kiedy nie robię żadnego zaokrąglania wynikiem jest 66.3000030517578125
>> Kiedy zaokrąglam ale nie dzielę przez 100 - 6630.00 (prawidłowo)
>> Kiedy zaokrąglam i dzielę przez 100 dostaję z powrotem
>> 66.3000030517578125... :/
>> 
>> Dla innych danych jest to odpowiednio:
>> 73.09999847412109375
>> 7310.00
>> 73.09999847412109375
>> 
>> Nie bardzo wiem jak to wytłumaczyć. Gdzie może tkwić błąd?
> Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
> natury przybliżony, a błędu zapewne nie ma nigdzie.
W takim razie czy istnieje jakiś sposób na bezbolesne przesunięcie
przecinka w lewo o 2 miejsca? Wydaje mi się że przy takich liczbach
(7310 i 100) FPU powinien być dokładny przy dzieleniu bo sprowadza się
to do operacji na cechach i ewentualnej normalizacji mantysy.

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1107
Author: Bernard
Date: Thu, 03 May 2007 18:02
9 lines
1477 bytes
Damian 'legion' Szuberski wrote:
>> Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
>> natury przybliżony, a błędu zapewne nie ma nigdzie.
> W takim razie czy istnieje jakiś sposób na bezbolesne przesunięcie
> przecinka w lewo o 2 miejsca? Wydaje mi się że przy takich liczbach
> (7310 i 100) FPU powinien być dokładny przy dzieleniu bo sprowadza się
> to do operacji na cechach i ewentualnej normalizacji mantysy.

Zapisz 73.10 binarnie w postaci stałopozycyjnej, a potem wyciągaj wnioski.
Re: FPU i zaokrąglanie
#1108
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 19:16
22 lines
1820 bytes
On 2007-05-03, Bernard wrote:
>>> Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
>>> natury przybliżony, a błędu zapewne nie ma nigdzie.
>> W takim razie czy istnieje jakiś sposób na bezbolesne przesunięcie
>> przecinka w lewo o 2 miejsca? Wydaje mi się że przy takich liczbach
>> (7310 i 100) FPU powinien być dokładny przy dzieleniu bo sprowadza się
>> to do operacji na cechach i ewentualnej normalizacji mantysy.
> Zapisz 73.10 binarnie w postaci stałopozycyjnej, a potem wyciągaj wnioski.
73.09999847412109375 = 1001001.00011001100110011
73.10 = 1001001.00011
7310 = 1110010001110
100 = 1100100

7310/100 = 73.10 = 1001001.0(0011)...

Faktycznie, w ferworze walki umknął mi fakt że działamy w systemie
binarnym...

Czyli mam rozumieć że zaokrąglania nie uzyskam? :/

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1109
Author: Bernard
Date: Thu, 03 May 2007 21:39
27 lines
2032 bytes
Damian 'legion' Szuberski wrote:
> On 2007-05-03, Bernard wrote:
>>>> Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
>>>> natury przybliżony, a błędu zapewne nie ma nigdzie.
>>> W takim razie czy istnieje jakiś sposób na bezbolesne przesunięcie
>>> przecinka w lewo o 2 miejsca? Wydaje mi się że przy takich liczbach
>>> (7310 i 100) FPU powinien być dokładny przy dzieleniu bo sprowadza się
>>> to do operacji na cechach i ewentualnej normalizacji mantysy.
>> Zapisz 73.10 binarnie w postaci stałopozycyjnej, a potem wyciągaj wnioski.
> 73.09999847412109375 = 1001001.00011001100110011
> 73.10 = 1001001.00011

Akurat... To powyżej, to 73 + 1/16 + 1/32. Te ułamki nie sumują się do 1/10.

> 7310 = 1110010001110
> 100 = 1100100
> 
> 7310/100 = 73.10 = 1001001.0(0011)...

O, już lepiej.

> Faktycznie, w ferworze walki umknął mi fakt że działamy w systemie
> binarnym...
> 
> Czyli mam rozumieć że zaokrąglania nie uzyskam? :/

Ależ właśnie uzyskałeś!!! :)
Re: FPU i zaokrąglanie
#1110
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 22:30
28 lines
2156 bytes
On 2007-05-03, Bernard wrote:
>>>>> Wytłumaczyć to można samą istotą zapisu zmiennopozycyjnego, który jest z 
>>>>> natury przybliżony, a błędu zapewne nie ma nigdzie.
>>>> W takim razie czy istnieje jakiś sposób na bezbolesne przesunięcie
>>>> przecinka w lewo o 2 miejsca? Wydaje mi się że przy takich liczbach
>>>> (7310 i 100) FPU powinien być dokładny przy dzieleniu bo sprowadza się
>>>> to do operacji na cechach i ewentualnej normalizacji mantysy.
>>> Zapisz 73.10 binarnie w postaci stałopozycyjnej, a potem wyciągaj wnioski.
>> 73.09999847412109375 = 1001001.00011001100110011
>> 73.10 = 1001001.00011
> Akurat... To powyżej, to 73 + 1/16 + 1/32. Te ułamki nie sumują się do 1/10.
Tak podaje bc.

>> 7310 = 1110010001110
>> 100 = 1100100
>> 
>> 7310/100 = 73.10 = 1001001.0(0011)...
> O, już lepiej.
>
>> Faktycznie, w ferworze walki umknął mi fakt że działamy w systemie
>> binarnym...
>> 
>> Czyli mam rozumieć że zaokrąglania nie uzyskam? :/
> Ależ właśnie uzyskałeś!!! :)
Żeby tylko można było obciąć część która bruździ...

-- 
Damian Szuberski
Re: FPU i zaokrąglanie
#1111
Author: Bernard
Date: Sat, 05 May 2007 07:24
16 lines
1767 bytes
Damian 'legion' Szuberski wrote:
>>> 7310/100 = 73.10 = 1001001.0(0011)...
>> O, już lepiej.
>>
>>> Faktycznie, w ferworze walki umknął mi fakt że działamy w systemie
>>> binarnym...
>>>
>>> Czyli mam rozumieć że zaokrąglania nie uzyskam? :/
>> Ależ właśnie uzyskałeś!!! :)
> Żeby tylko można było obciąć część która bruździ...

Można, ale już na etapie formatowania wyjścia w C. Po pierwsze - możesz 
użyć formatu z dwoma miejscami części ułamkowej. Po drugie - możesz 
wyprodukować wartość całkowitą, a następnie zrobić coś w stylu
printf("%d.%02d", v / 100, v % 100);
Ta druga metoda daje się zastosować w czystym asemblerze.
Re: FPU i zaokrąglanie
#1112
Author: Damian 'legion' Szuberski
Date: Sat, 05 May 2007 14:17
19 lines
1920 bytes
On 2007-05-05, Bernard wrote:
>>>> 7310/100 = 73.10 = 1001001.0(0011)...
>>> O, już lepiej.
>>>
>>>> Faktycznie, w ferworze walki umknął mi fakt że działamy w systemie
>>>> binarnym...
>>>>
>>>> Czyli mam rozumieć że zaokrąglania nie uzyskam? :/
>>> Ależ właśnie uzyskałeś!!! :)
>> Żeby tylko można było obciąć część która bruździ...
> Można, ale już na etapie formatowania wyjścia w C. Po pierwsze - możesz 
> użyć formatu z dwoma miejscami części ułamkowej. Po drugie - możesz 
> wyprodukować wartość całkowitą, a następnie zrobić coś w stylu
> printf("%d.%02d", v / 100, v % 100);
> Ta druga metoda daje się zastosować w czystym asemblerze.
Tak właśnie zrobiłem. W każdym razie dzięki serdeczne za wszelką pomoc..

-- 
Damian Szuberski
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads