Je to dobrý nápad použít IEEE754 s pohyblivou řádovou čárkou NaN na hodnoty, které nejsou stanoveny?

hlasů
13

Je to dobrý nápad použít IEEE754 s pohyblivou řádovou čárkou NaN (not-a-number) na hodnoty, které nejsou definovány pro non-matematických důvodů?

V našem případě, že ještě nejsou nastaveny, protože nebyly přijaty hodnoty z nějakého jiného zařízení. Kontext je vestavěný systém použitím hodnot IEC1131 REAL32. Edit: Programovací jazyk C, takže bychom s největší pravděpodobností používat NAN a isnanf (x), které jsou od C99. I když budeme potřebovat nějaké další zkroucení dostat je do naší kompatibility OS vrstvy.

Výchozí v programovacích jazycích se zdá být inicializovat proměnné s plovoucí desetinnou čárkou s kladnou nulou, jehož vnitřní reprezentace je samé nuly. To není použitelný pro nás, protože 0 je v rozsahu platných hodnot.

Vypadá to, že čisté řešení pro využití NaN, ale možná je to víc potíží, než to stojí za to a že bychom měli vybrat nějakou jinou hodnotu?

Položena 24/06/2009 v 07:25
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
11

Jen si všiml na tuto otázku.

To je jeden z použití Nans že IEEE 754 Výbor má na mysli (byl jsem členem výboru). Pravidla pro šíření pro Nans v aritmetice, aby to velmi atraktivní, protože pokud máte výsledek z dlouhé posloupnosti výpočtů, které se týkají některé inicializovaná data nebude splést výsledek za platný výsledek. To může také zpětné vysledování prostřednictvím vašich výpočtů zjistit, kde používáte inicializační údaje mnohem přímočařejší.

To znamená, že existuje několik úskalí, které jsou mimo kontrolu 754 výboru: jak si všimli jiní, ne všichni hardware podporuje hodnoty rychlostí, což může mít za následek nebezpečí výkonu NaN. Naštěstí se člověk nemusí často mnoho operací na inicializovaných dat v prostředí výkonu kritických.

Odpovězeno 15/10/2009 v 17:25
zdroj uživatelem

hlasů
4

NaN jsou rozumná volba pro ‚bezcenné‘ větné (D programovací jazyk používá je k neinicializované hodnoty, například), ale proto, že jakékoliv srovnání zahrnující jim bude false, můžete získat několik překvapení:

  • if (result == DEFAULT_VALUE), Nebude fungovat podle očekávání, pokud DEFAULT_VALUEje NaN, jak Jon zmínil.

  • Mohou také způsobit problémy s kontrolou rozsahu, pokud si nedáte pozor. Zvažte funkce:

bool isOutsideRange (double x, double MINVALUE, double MAXVALUE)
{
    vrátí x <MINVALUE || x> MAXVALUE;
}

Je-li x NaN, tato funkce by nesprávně hlásit, že x je mezi MINVALUE a MAXVALUE.

Pokud chcete jen kouzelnou hodnotu pro uživatele testovat proti, doporučoval bych kladné nebo záporné nekonečno místo Nan, protože nepřijde s stejné pasti. Použijte NaN, když budete chtít pro svou vlastnost, že všechny operace na NaN vyústit v NaN: je to užitečné, když nechcete spoléhat na volajícím kontrola hodnoty, např.

[Edit! Původně jsem dokázal psát „jakékoliv srovnání zahrnující jim bude platit“ nad, což není to, co jsem měl na mysli, a je špatné, že jsou falešné, na rozdíl od NaN = NaN, což je pravda]

Odpovězeno 24/06/2009 v 08:41
zdroj uživatelem

hlasů
3

Myslím, že je to špatný nápad vůbec. Jedna věc je mít na paměti, je, že většina CPU treat Nan mnohem pomalejší než „obvyklý“ float. A to je těžké zaručit, že nikdy nebude mít Nan v obvyklých nastavení. Moje zkušenosti v numerické výpočty je to, že často přináší více problémů než to worths.

Správné řešení je, aby se zabránilo kódování „nepřítomnost hodnoty“ v plováku, ale to signál jiným způsobem. To není vždy praktické, ale v závislosti na codebase.

Odpovězeno 24/06/2009 v 19:31
zdroj uživatelem

hlasů
3

Použil jsem Nans v podobných situacích jen z důvodu, že: obvyklá výchozí inicializační hodnota 0 je platná hodnota. NaN fungovat dobře tak daleko.

To je dobrá otázka, mimochodem, proč je výchozí hodnota inicializační je obvykle (například v primitivní typy Java) 0, a ne NaN. Nemohl to být stejně 42 nebo co? Zajímalo by mě, co je důvodem nul.

Odpovězeno 24/06/2009 v 07:30
zdroj uživatelem

hlasů
2

Buďte opatrní s NaN je ... že se může šířit jako požár, pokud si nejste opatrní.

Jsou dokonale platná hodnota pro plováky, ale veškeré úkoly z nich zahrnuje také rovné Nan, takže se šíří prostřednictvím kódu. To je docela dobrý jako ladící nástroj, pokud ji chytit, ale také to může být skutečnou obtíž, pokud jste přinášet něco k uvolnění a tam je okrajový případ někde.

D používá toto jako důvod pro dávání plave NaN jako výchozí. (Což nejsem si jistý, s Souhlasím).

Odpovězeno 24/06/2009 v 09:42
zdroj uživatelem

hlasů
1

Mé pocity jsou, že je to trochu hacky, ale nejméně jednou za jiná čísla budete provádět operace s touto hodnotou NaN dává NaN jako výsledek - když vidíte NaN ve zprávě o chybě, alespoň víte, jaké chyby jste na lov.

Odpovězeno 24/06/2009 v 09:16
zdroj uživatelem

hlasů
0

Pomocí NaN jako výchozí hodnota je přiměřená.

Všimněte si, že některé výrazy, jako je například (0,0 / 0,0), vrátí NaN.

Odpovězeno 10/07/2009 v 22:34
zdroj uživatelem

hlasů
0

To zní jako dobrý použití pro Nans ke mně. Přál jsem si myslel, že to ...

Jistě, oni mají šířit jako virus, to je fakt.

Myslím, že bych použil nan namísto jednoho z nekonečna. Mohlo by to být pěkné použít signalizační nan a mají to způsobit událost na prvním použití, ale to bude příliš pozdě, že by mělo jít klid při prvním použití.

Odpovězeno 10/07/2009 v 22:26
zdroj uživatelem

hlasů
0

Pokud je vaše základní potřebou je mít plovoucí bodovou hodnotu, která nepředstavuje číslo, které by mohly případně byla obdržena z přístroje, a v případě, že zařízení je zárukou, že se už nikdy nevrátí Nan, pak se zdá rozumné, aby mě.

Jen nezapomeňte, že v závislosti na prostředí, budete pravděpodobně potřebovat zvláštní způsob detekce NaN (ne jen používat if (x == float.NaN)nebo bez ohledu na vaše ekvivalent je.)

Odpovězeno 24/06/2009 v 07:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more