🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
11 messages
11 total messages Started by Gregory Moron Mon, 24 Oct 2011 20:43
dziedziczenie po typie float
#22265
Author: Gregory Moron
Date: Mon, 24 Oct 2011 20:43
39 lines
2284 bytes
mam pewną zmienną o typie float i chciałbym porównując takie zmienne chcę 
móc mieć możliwość określenia warunku ich równości:
np. chciałbym aby liczby z przedziału (1,2) były równe 1, z przedziału (2,3) 
były równe 2. itd. (taki Math.Floor(value ))

Ponieważ wykorzystuję LINQ to żeby uzyskać takie wyniki muszę napisać własny 
komparator dla typu float i podawać go jako parametr dla różnych extension 
methods w rodzaju Where, Distinct itp.
Nie ma problemu oczywiście żebym zrobił cos takiego jak poniżej:

class floatComparer : IEqualityComparer<float>
{
    public bool Equals(float x, float y)
    {
        throw new NotImplementedException();
    }
    public int GetHashCode(float obj)
    {
        throw new NotImplementedException();
    }
}
Po zaimplementowaniu "Equals" i "GetHashCode" (z użyciem Math.Floor właśnie) 
miałbym to co chcę.

Niestety to spowoduje, ze wszystkie porównania floatow zaczną się tak 
zachowywać. A tego nie chcę.
W zdecydowanej większości inne zmienne typu float mają się zachowywać 
"normalnie".

I tu jestem w kropce.
Niestety nie można stworzyć typu myfloat (dla tej jednej zmiennej) 
dziedziczącego po float  i dla niej custom comparera jw.
Nie można, bo wszystkie zmienne podstawowe są zapieczętowane (bo tak 
naprawdę są "value type").

Jak wybrnąć z tej sytuacji?

pozdr
GM
Re: dziedziczenie po typie float
#22266
Author: Robert Winkler
Date: Tue, 25 Oct 2011 05:21
22 lines
1837 bytes
> Niestety nie można stworzyć typu myfloat (dla tej jednej zmiennej) 
> dziedziczącego po float  i dla niej custom comparera jw.
> Nie można, bo wszystkie zmienne podstawowe są zapieczętowane (bo tak 
> naprawdę są "value type").
>
> Jak wybrnąć z tej sytuacji?

Tylko dlaczego nie możesz stworzyć własnej zmiennej przechowującej dane typu 
float?

Stwórz strukture zawierającą jedno pole typu float.
Nadpisz equals, gethashcode,
nadpisz operatory(przyrównania, dodawania, odejmowania, możenia, dzielenia)
napisz własne funkcje konversji z float i do float (eventualnie też double i 
int ponieważ takie typy mają domyśnie literały)

Korzystaj potem, tam gdzie to konieczne, z tego własnego typu zamiast ze 
standardowego float-a
-- 
__________
Pozdrawiam
Robert Winkler 
Re: dziedziczenie po typie float
#22267
Author: Piotr Stęclik
Date: Sat, 19 Nov 2011 18:58
28 lines
2131 bytes
W dniu 2011-10-24 22:43, Gregory Moron pisze:
> mam pewną zmienną o typie float i chciałbym porównując takie zmienne
> chcę móc mieć możliwość określenia warunku ich równości:
> np. chciałbym aby liczby z przedziału (1,2) były równe 1, z przedziału
> (2,3) były równe 2. itd. (taki Math.Floor(value ))
>
> Ponieważ wykorzystuję LINQ to żeby uzyskać takie wyniki muszę napisać
> własny komparator dla typu float i podawać go jako parametr dla różnych
> extension methods w rodzaju Where, Distinct itp.
> Nie ma problemu oczywiście żebym zrobił cos takiego jak poniżej:
A nie myślałeś o napisaniu extension method? Mogło by to tak mniej 
więcej wyglądać


   public static class MyExtensionStaticClass
     {
         public static bool MySophisticatedCompare(this float x, float y)
         {
             return Math.Floor(x) == Math.Floor(y);
         }
     }

a w kodzie LINQ (lub każdym innym) możesz korzystać jak z normalnej metody:
	float a = 1;
	float b = 4;
	bool wynik = a.MySophisticatedCompare(b);

Piotr Stęclik
Re: dziedziczenie po typie float
#22275
Author: Piotr Stęclik
Date: Sat, 19 Nov 2011 19:00
28 lines
2131 bytes
W dniu 2011-10-24 22:43, Gregory Moron pisze:
> mam pewną zmienną o typie float i chciałbym porównując takie zmienne
> chcę móc mieć możliwość określenia warunku ich równości:
> np. chciałbym aby liczby z przedziału (1,2) były równe 1, z przedziału
> (2,3) były równe 2. itd. (taki Math.Floor(value ))
>
> Ponieważ wykorzystuję LINQ to żeby uzyskać takie wyniki muszę napisać
> własny komparator dla typu float i podawać go jako parametr dla różnych
> extension methods w rodzaju Where, Distinct itp.
> Nie ma problemu oczywiście żebym zrobił cos takiego jak poniżej:
A nie myślałeś o napisaniu extension method? Mogło by to tak mniej 
więcej wyglądać


   public static class MyExtensionStaticClass
     {
         public static bool MySophisticatedCompare(this float x, float y)
         {
             return Math.Floor(x) == Math.Floor(y);
         }
     }

a w kodzie LINQ (lub każdym innym) możesz korzystać jak z normalnej metody:
	float a = 1;
	float b = 4;
	bool wynik = a.MySophisticatedCompare(b);

Piotr Stęclik
Re: dziedziczenie po typie float
#22268
Author: Miroo
Date: Wed, 25 Jan 2012 12:44
10 lines
1466 bytes
W dniu 2011-11-19 19:58, Piotr Stęclik pisze:
> return Math.Floor(x) == Math.Floor(y);

Takie operacje jak Floor na floatach są ryzykowne, ponieważ liczba 
wyświetlana na ekranie np jako 6,00 po obcięciu ułamka może być równa 
5,00 (bo było to 5,999999999999999999). Teoretycznie każdy programista 
ma tego świadomość, a jednak można się brzydko naciąć.

Pozdrawiam
Miroo
Re: dziedziczenie po typie float
#22269
Author: Artur Muszyński
Date: Wed, 25 Jan 2012 19:20
9 lines
1408 bytes
W dniu 2012-01-25 13:44, Miroo pisze:
> Takie operacje jak Floor na floatach są ryzykowne, ponieważ liczba
> wyświetlana na ekranie np jako 6,00 po obcięciu ułamka może być równa
> 5,00 (bo było to 5,999999999999999999). Teoretycznie każdy programista
> ma tego świadomość, a jednak można się brzydko naciąć.

Nie bardzo w to wierzę.

artur
Re: dziedziczenie po typie float
#22270
Author: Paweł Kierski
Date: Thu, 26 Jan 2012 09:07
14 lines
1591 bytes
W dniu 2012-01-25 20:20, Artur Muszyński pisze:
> W dniu 2012-01-25 13:44, Miroo pisze:
>> Takie operacje jak Floor na floatach są ryzykowne, ponieważ liczba
>> wyświetlana na ekranie np jako 6,00 po obcięciu ułamka może być równa
>> 5,00 (bo było to 5,999999999999999999). Teoretycznie każdy programista
>> ma tego świadomość, a jednak można się brzydko naciąć.
>
> Nie bardzo w to wierzę.

W świadomość, czy w możliwość nacięcia się?

-- 
     Paweł Kierski
     news@pkierski.net
Re: [OT] dziedziczenie po typie float
#22274
Author: wloochacz
Date: Thu, 26 Jan 2012 10:00
8 lines
1004 bytes
W dniu 2011-11-19 19:58, Piotr Stęclik pisze:
>
> Piotr Stęclik
O masakra!
Ty żyjesz?! :)

-- 
wloochacz
Re: dziedziczenie po typie float
#22271
Author: Miroo
Date: Thu, 26 Jan 2012 12:52
18 lines
1719 bytes
W dniu 2012-01-25 20:20, Artur Muszyński pisze:
> W dniu 2012-01-25 13:44, Miroo pisze:
>> Takie operacje jak Floor na floatach są ryzykowne, ponieważ liczba
>> wyświetlana na ekranie np jako 6,00 po obcięciu ułamka może być równa
>> 5,00 (bo było to 5,999999999999999999). Teoretycznie każdy programista
>> ma tego świadomość, a jednak można się brzydko naciąć.
>
> Nie bardzo w to wierzę.

A ile ci wychodzi w wyniku takiego działania?
     double x, y, z, wynik;
     x = 20.15;
     y = 4.15;
     z = x - y;
     wynik = Math.Floor(z);

Pozdrawiam
Miroo
Re: dziedziczenie po typie float
#22272
Author: Artur Muszyński
Date: Fri, 27 Jan 2012 19:24
22 lines
1977 bytes
W dniu 2012-01-26 13:52, Miroo pisze:
> W dniu 2012-01-25 20:20, Artur Muszyński pisze:
>> W dniu 2012-01-25 13:44, Miroo pisze:
>>> Takie operacje jak Floor na floatach są ryzykowne, ponieważ liczba
>>> wyświetlana na ekranie np jako 6,00 po obcięciu ułamka może być równa
>>> 5,00 (bo było to 5,999999999999999999). Teoretycznie każdy programista
>>> ma tego świadomość, a jednak można się brzydko naciąć.
>>
>> Nie bardzo w to wierzę.
>
> A ile ci wychodzi w wyniku takiego działania?
> double x, y, z, wynik;
> x = 20.15;
> y = 4.15;
> z = x - y;
> wynik = Math.Floor(z);

Znam zawiłości zapisu zmiennoprzecinkowego, ale chciałbym zobaczyć 
działający przykład tezy, że "liczba wyświetlana na ekranie np jako 6,00 
po obcięciu ułamka może być równa 5,00 (bo było to 5,999999999999999999)".

artur
Re: dziedziczenie po typie float
#22273
Author: Miroo
Date: Mon, 30 Jan 2012 07:13
9 lines
1575 bytes
W dniu 2012-01-27 20:24, Artur Muszyński pisze:
> Znam zawiłości zapisu zmiennoprzecinkowego, ale chciałbym zobaczyć
> działający przykład tezy, że "liczba wyświetlana na ekranie np jako 6,00
> po obcięciu ułamka może być równa 5,00 (bo było to 5,999999999999999999)".

Może po prostu napisz gdzie wg Ciebie popełniłem błąd.

Pozdrawiam
Miroo
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