Proč je nejběžnější celé číslo 32 bitů, ale nejběžnější číslo s plovoucí desetinnou čárkou 64 bitů?

Z prostředí Java a C # jsem se naučil používat int (32 bitů) kdykoli potřebujete celé číslo a double (64 bitů) při práci s zlomkovými hodnotami. Většina metod z jejich příslušných rámců (JVM a .NET) tyto dva typy obvykle očekává.

Moje otázka zní, proč kvůli konzistenci nepoužíváme long a double? Vím, že mít 64 bitů přesnosti v celých číslech většinu času není potřeba, ale opět obvykle nepotřebujeme 64 bitů přesnosti v číslech s plovoucí desetinnou čárkou, nebo ano?

Co je důvody, pokud existují?

Komentáře

  • “ Mohlo by se to zdát jako float stačit na to, co by kdokoli rozumně potřeboval, ale ‚ to není … 64bitová dvojice se svými 15 desetinnými číslicemi vlastně není ‚ t dost dobré pro mnoho aplikací … “ ( Proč potřebujete float / double? )
  • Z pozadí C jsem se ‚ naučil používat BigDecimal pro čísla s plovoucí desetinnou čárkou, protože zaokrouhlování a porovnávání hodnot FP je tak problematické.
  • @TMN I ‚ si nejsem jistý, že typ, který hodí, když se pokusíte vypočítat 1/3, je řešením pro každý .

A nswer

Rozsah vs. přesnost

Jedna věc je, že popírám myšlenku, že nejběžnější číslo s plovoucí desetinnou čárkou používá 64bitovou reprezentaci DPFP (s plovoucí desetinnou čárkou s dvojitou přesností).

Alespoň v reálných časová pole jako hry, SPFP (plovoucí desetinná čárka s jednou přesností) je stále mnohem běžnější, protože aproximace a rychlost je lepší než maximální přesnost.

Možná je však jeden způsob, jak se na to dívat -bit int představuje rozsah 2^32 celých čísel (~ 4,3 miliardy). Nejběžnější použití celých čísel bude pravděpodobně jako indexy prvků a to „je docela zdravá škála prvků, které by bylo obtížné překročit bez překročení paměti dostupné u dnešního hardwaru *.

* Pamatujte, že při přidělení / přístupu k jednomu souvislému bloku 4 gigabajty i při volném 30 gigabajtech může dojít k chybě paměti, např. kvůli souvislosti požadavky tohoto bloku.

32bitové celé číslo není na úrovni instrukcí vždy efektivnější, ale je má tendenci být obecně efektivnější při agregaci do pole, např. protože vyžaduje polovinu paměti (např. více indexů, které se vejdou do jedné stránky / mezipaměti).

Všimněte si také, že jako Lightness Races in Orbit poukazuje na to, že ze široké perspektivy nemusí nutně platit ani to, že běžnější jsou 32bitová celá čísla. Mám úzkou perspektivu vycházející z pole, kde 32bitové ints jsou často agregovány o statisíce až miliony jako indexy do jiné struktury – tam může poloviční velikost pomoci hodně.

Nyní lze 64bitový DPFP použít mnohem více než 64bitová celá čísla v některých kontextech. Tam další bity přidávají spíše přesnost než rozsah . Mnoho aplikací může vyžadovat přesnost, nebo alespoň mít mnohem snazší čas programování s extra přesností k dispozici. Takže to je pravděpodobně důvod, proč 64bitové DPFP mohou být v některých oblastech častější než 64bitová celá čísla a proč int může být stále 32 bitů v mnoha scénářích i na 64bitových platformách.

Komentáře

  • I ‚ d nápad napadnout že nejběžnější integrální datový typ je široký také 32 bitů, alespoň v programech napsaných dnes na komoditním hardwaru. 64bitové platformy jsou nyní tak rozšířené.
  • @I Ke: Je podezření, že mnoho softwaru používá int a long, aniž by se staral o to, jaký je rozsah … a domnívám se, že takový software v obou případech v současnosti převážně používá 64bitová celá čísla.
  • Hmm stojím opravený; zjevně int je obecně stále 32bitový , hlavně proto, aby se zabránilo zavádění chyb právě v tomto druhu kódu. Dobře, ‚ stále máte size_t a long.
  • @LightnessRacesinOrbit Aha, chápu, jsem ‚ m extrémně zkreslený, protože často pracuji v kódových základnách, které agregují celá čísla do nějaké datové struktury se znepokojením nad celkovou velikostí paměti. Snažil jsem se, aby moje odpověď byla co nejneutrálnější.
  • @I ke: Osobně také dělám všechny své typy explicitně velké.Ale ty a já jsme nepochybně nenormální. 🙂

Odpověď

No, int a double je Java věc. Například v Objective-C a Swift byste použili NSInteger nebo Int, což je 32 bitů na 32bitovém stroji a 64 bitů na 64bitovém stroji. Dost velký na to, aby spočítal libovolný počet položek, které by mohly být v paměti. Rozhodně užitečné je použít stejný typ téměř všude, pokud v konkrétní situaci nepotřebujete něco jiného.

Java se snaží mít kód, který běží stejně na jakékoli implementaci, takže si myslí, že byste měli používat stejný typ nezávisle na stroji, který používáte, a že tento typ by měl mít stejný počet bitů nezávisle na stroj. Objective-C a Swift (a také C, C ++) mají jiný úhel pohledu.

Celá čísla se většinou používají k počítání věcí a obvykle nemáte tolik věcí k počítání. Aritmetika s plovoucí desetinnou čárkou vyžaduje přesnost a 32bitová plovoucí desetinná čárka vám často neposkytuje dostatečnou přesnost. Použití 64 bitů double všude vám dává šanci bojovat, abyste měli vždy dostatečnou přesnost, aniž byste byli specialistou na aritmetiku s plovoucí desetinnou čárkou. float doesn „t.

Ale jaká konzistence by vám dala použití long a double? Celá čísla a čísla s plovoucí desetinnou čárkou nejsou totéž. Není nutné, aby měly konzistentní velikost bitů. Používám 2D body a obdélníky hodně. Takže kvůli konzistenci by to mělo být také 64 bitů? Body, které mají 32 bitů na komponentu, a obdélníky, které mají 16? Samozřejmě že ne. Není nutná konzistence.

Komentáře

  • Toto je velmi pěkná odpověď vysvětlující její straně JVM zachování stejné velikosti každého typu bez ohledu na platformu.

Answer

short, int, single and double are the same size in java as they are in most common C compilers for 32-bit and 64-bit platform and C like java jasně považuje int za hlavní celočíselný typ a double za hlavní typ s plovoucí desetinnou čárkou. Myslím, že je rozumné říci, že Java tuto konvenci zdědila v té době od běžných překladačů C.

Celá čísla jsou obvykle používá se pro c ounting nebo indexování věcí. Je to docela vzácné (i když ne neslýchané) potřeba počítat nebo indexovat více než 2 miliardy něčeho. Opravdu před C99 jste museli použít typy specifické pro dodavatele, pokud jste chtěli 64bitové celé číslo.

Čísla s plovoucí desetinnou čárkou se obvykle používají jako aproximace reálných čísel. Jednoduchá přesnost je dostatečně dobrá po většinu času, ale není těžké najít problémy, kde by způsobovala nepřijatelné množství chyb zaokrouhlování. Očekávám, že poptávka z vědeckých výpočtů je to, co vedlo k tomu, že podpora plovoucí desetinné čárky s dvojitou přesností byla všudypřítomná dlouho před 64bitovou celočíselná podpora byla.

Zajímavé je, že se zdá, že C podporuje používání double, zatímco Fortran se zdá, že podporuje použití přesné přesnosti.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *