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
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 20:46
Date: Wed, 02 May 2007 20:46
10 lines
1091 bytes
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
Author: Lopez
Date: Wed, 02 May 2007 22:41
Date: Wed, 02 May 2007 22:41
17 lines
1366 bytes
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
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 22:46
Date: Wed, 02 May 2007 22:46
13 lines
1282 bytes
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
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 23:56
Date: Wed, 02 May 2007 23:56
29 lines
1618 bytes
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
Author: Damian 'legion' Szuberski
Date: Wed, 02 May 2007 23:58
Date: Wed, 02 May 2007 23:58
28 lines
1611 bytes
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
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 00:03
Date: Thu, 03 May 2007 00:03
34 lines
1734 bytes
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
Author: Bernard
Date: Thu, 03 May 2007 07:29
Date: Thu, 03 May 2007 07:29
15 lines
1430 bytes
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
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 10:19
Date: Thu, 03 May 2007 10:19
21 lines
1784 bytes
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
Author: Bernard
Date: Thu, 03 May 2007 18:02
Date: Thu, 03 May 2007 18:02
9 lines
1477 bytes
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
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 19:16
Date: Thu, 03 May 2007 19:16
22 lines
1820 bytes
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
Author: Bernard
Date: Thu, 03 May 2007 21:39
Date: Thu, 03 May 2007 21:39
27 lines
2032 bytes
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
Author: Damian 'legion' Szuberski
Date: Thu, 03 May 2007 22:30
Date: Thu, 03 May 2007 22:30
28 lines
2156 bytes
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
Author: Bernard
Date: Sat, 05 May 2007 07:24
Date: Sat, 05 May 2007 07:24
16 lines
1767 bytes
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
Author: Damian 'legion' Szuberski
Date: Sat, 05 May 2007 14:17
Date: Sat, 05 May 2007 14:17
19 lines
1920 bytes
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