Ahogy én látni vélem, nem volt tömegigény pontosabb lebegőpontos számításokra. Volt például tömegigény kevésbé pontos számítások gyors, párhuzamos végzésére, hangok, képek, filmek előállításához/lejátszásához.
A mai processzorok (i3-i7-Ryzen, stb.) HARDVERESEN ugyanúgy csak max. 64-bites lebegőpontos műveletekre képesek, mint a 35-40 évvel ezelőttiek (80486-os, ill. a 287,387 koprocik)?
Miért nem használnak nagyobb pontosságot a szoftverek, ha az ugyanúgy elérhető? Pl. az EXCEL a "double" 53 bit pontosságot használ, az "extended" 64 bit pontosság helyett!???
(A nagyobb pontosság előnyeit aligha kell magyarázni.)
Ha olyan számításokat szeretnék tömegével elvégezni, amihez nem elég a 64 bit pontosság, hanem 96-128 kellene, akkor ez csak szoftveresen, 1-2 nagyságrenddel lassabban fog menni?
Illetve, ha jól látom, ez egy little-endian platform, tehát szemléletesebb lehet, ha megfordítom a byte-sorrendet (most az első byte a karakterisztika):
Beidézem a program kimenetét (kicsit átrendezve, hátha jobban hasonlít egy táblázatra), azt kellene látni belőle, hogy még a 0.1 sem véges kettedes tört, vagyis már azt sem tudjuk pontosan ábrázolni.
Köszönöm, hogy ennyit fáradoztok, jó ez az idelinkelt bittérkép. Most vettem észre, milyen jól ki van ez találva. :)
Felületesen eddig is ismertem a lebegőpontos ábrázolást, csak nem gondoltam végig, hogy simán hozzá lehet adni 1-et az utolsó bithez, és máris megvan a "rákövetkező" double érték. Eddig attól féltem, hogy a "having an implicit integer bit of value 1" a kettedespont helyén belezavarhat a kitevőbe, de most úgy látom, azzal se kell törődni. Abban a (kb. 1E-16 valószínűségű) esetben is a helyes érték adódik, amikor a kitevő utolsó bitjére van átvitel.
Ebben segíthet egy apró csalás: ez a program kiírja a lebegőpontos számot binárisan, tehát segíthet kitalálni, hogy mit/mennyivel kell növelni.
/* float.c */
#include <stdio.h>
static void Test (double d);
int main (void) { Test (20); Test (21); Test (22); Test (21.5); Test (21.25); Test (21.125); Test (21.1); Test (1); Test (0.5); Test (0.25); Test (0.125); Test (0.1);
return 0; }
static void Test (double d) { size_t i;
printf ("%6g is ", d); for (i=0; i<sizeof (d); ++i) { printf ("%02x", ((unsigned char *)&d)[i]); } printf ("\n"); }
Írjuk meg azt a függvényt, ami egy float (vagy double) x számnak a "rákövetkezőjét" előállítja. Vagyis azt - az adott gépi ábrázolásban egyértelműen létező - legkisebb xx számot, amire xx>x teljesül.
(Úgy látom, nemcsak a backslas törlődik, hanem a következő karaktert is. Itt próbálom ki, ha kettőzöm, akkor is törli? Backslash n (vagy nem az): \n)
Bocs, JS-ben analfabéta vagyok, csak kíváncsiságból kérdezem: ott nincs egész (int) típus? Vagy van, de annak a használatát most kizárja a játékszabály? Közönséges C-ben ezt mindig így (vagy ezzel ekvivalens módon) csináljuk: */
int i; float f, h; h=1.0/100; for(i=0; i<300; ++i) { f=i*h; printf("%1.2fn", f); } // Persze lehet tömörebben (f és h bevezetése nélkül) is, de most nem az volt a célom.