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
Author: Gregory Moron
Date: Mon, 24 Oct 2011 20:43
Date: Mon, 24 Oct 2011 20:43
39 lines
2284 bytes
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
Author: Robert Winkler
Date: Tue, 25 Oct 2011 05:21
Date: Tue, 25 Oct 2011 05:21
22 lines
1837 bytes
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
Author: Piotr Stęclik
Date: Sat, 19 Nov 2011 18:58
Date: Sat, 19 Nov 2011 18:58
28 lines
2131 bytes
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
Author: Piotr Stęclik
Date: Sat, 19 Nov 2011 19:00
Date: Sat, 19 Nov 2011 19:00
28 lines
2131 bytes
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
Author: Miroo
Date: Wed, 25 Jan 2012 12:44
Date: Wed, 25 Jan 2012 12:44
10 lines
1466 bytes
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
Author: Artur Muszyński
Date: Wed, 25 Jan 2012 19:20
Date: Wed, 25 Jan 2012 19:20
9 lines
1408 bytes
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
Author: Paweł Kierski
Date: Thu, 26 Jan 2012 09:07
Date: Thu, 26 Jan 2012 09:07
14 lines
1591 bytes
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
Author: wloochacz
Date: Thu, 26 Jan 2012 10:00
Date: Thu, 26 Jan 2012 10:00
8 lines
1004 bytes
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
Author: Miroo
Date: Thu, 26 Jan 2012 12:52
Date: Thu, 26 Jan 2012 12:52
18 lines
1719 bytes
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
Author: Artur Muszyński
Date: Fri, 27 Jan 2012 19:24
Date: Fri, 27 Jan 2012 19:24
22 lines
1977 bytes
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
Author: Miroo
Date: Mon, 30 Jan 2012 07:13
Date: Mon, 30 Jan 2012 07:13
9 lines
1575 bytes
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