Autor Wątek: Floating point, najwięszka liczba mniejsza od pewnej całkowitej.  (Przeczytany 2195 razy)

Offline koirat

  • Użytkownik

# Marzec 23, 2015, 13:33:47
Sprawa jest prosta:

Powiedzmy że mam liczbę X która jest liczbą całkowitą.
Poszukuje takiej liczby C która będzie największą możliwą liczbą zmiennoprzecinkową mniejszą od X.

Alternatywą była by możliwość "zmuszenia" aby operacje wykonywane na liczbach nigdy nie przekraczały rzeczywistej wartości wyniku.
np: jeśli w rzeczywistości wynik był by 1 to żeby nie został zapisany jako 1.0000000025 tylko 0.999999999

Nad tą alternatywą długo się nie zastanwaiałem więc może się tego nie dać zrobić.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 23, 2015, 14:51:50
Cytuj
Alternatywą była by możliwość "zmuszenia" aby operacje wykonywane na liczbach nigdy nie przekraczały rzeczywistej wartości wyniku.
No to włącz na FPU zaokrąglenie "w dół" i jazda. :)

Offline koirat

  • Użytkownik

# Marzec 23, 2015, 15:10:12
Przemyślałem to i jednak alternatywa i tak by mi niewiele pomogła.

Zresztą pewnie w c# w którym pisze i tak nie da się tego ustawić i pozostać kompatybilnym z różnymi platformami.

Na razie skorzystałem ze stałej i zmniejszam cyfrę po Ceil(float value) o jakąś tam marginalną wartość, jakoś to działa, chociaż nie wiem czy nie będę miał jakichś koszmarów z tego powodu dzisiaj w nocy :|

Offline Xirdus

  • Redaktor

# Marzec 23, 2015, 15:13:37
Już miałem powiedzieć "reinterpret_castuj do inta i odejmij 1", ale C#...

Offline deadeye

  • Użytkownik

# Marzec 23, 2015, 16:47:47
Na razie skorzystałem ze stałej i zmniejszam cyfrę po Ceil(float value) o jakąś tam marginalną wartość, jakoś to działa, chociaż nie wiem czy nie będę miał jakichś koszmarów z tego powodu dzisiaj w nocy :|
Rób tak, tylko odejmuj Single.Epsilon, i masz gwarancje najmniejszej możliwej wartości.

Alternatywnie możesz flota zamienić na tablice bajtów i tam podwyższyć mantysę o jeden.
« Ostatnia zmiana: Marzec 23, 2015, 16:50:16 wysłana przez deadeye »

Offline koirat

  • Użytkownik

# Marzec 23, 2015, 18:33:41
Rób tak, tylko odejmuj Single.Epsilon, i masz gwarancje najmniejszej możliwej wartości.
Epsilon to najmniejsza możliwa wartość, ale co mi to daje.
Ja potrzebuję najmniejszej liczby która by zmieniła wartość danej liczby.

[edit]
A nawet musi robić więcej, musi gwarantować zejście do bliższemu zeru przedziału liczby przed przecinkiem.
[/edit]
« Ostatnia zmiana: Marzec 23, 2015, 18:36:46 wysłana przez koirat »

Offline Dab

  • Redaktor
    • blog

  • +1
# Marzec 23, 2015, 18:54:50
Już miałem powiedzieć "reinterpret_castuj do inta i odejmij 1", ale C#...

W C++ to akurat prosta sprawa - std::nextafter.
W C# trzeba zrobić to ręcznie, sposobów jest wiele (np. http://realtimemadness.blogspot.com/2012/06/nextafter-in-c-without-allocations-of.html).

Offline koirat

  • Użytkownik

# Marzec 23, 2015, 21:20:02
Ciekawe, chociaż przyznam iż mój problem nie jest chyba na tyle krytyczny żeby posunąć się do czegoś takiego.