Hur många decimaler använder din platform?
Postat: 20 mars 2016, 02:23:30
Såg att NASA använder 15 decimaler av pi vid beräkning för rymdnavigering. Så blev nyfiken på hur många decimaler kompilatorn för C använder och skrev nedanstående program för att ta reda på det.
För en little endian (clang) 32-bit unix platform blir resultatet:
För 64-bit:
Är specifikt intresserad av vad "Precision for()" ger för resultat då det representerar primärt hur många decimaler som används vid programkodens interna beräkning på platformen. Och förstås vad slags för platform som ger detta resultat.
Kan du testa på någon annan platform och klistra in resultatet? nyfiken på om andra platformar använder fler decimaler vid beräkning(ar).
Kod: Markera allt
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#define MACRO_STRINGIFICATION(s) STRINGIFICATION(s)
#define STRINGIFICATION(s) #s
int main(int ac, char *av[]){
int i, i0, i1, max_digits;
long double ld0;
unsigned char *buf, *p, buf_d[1024], *m_pi=MACRO_STRINGIFICATION(M_PI);
size_t bufsiz = 1024;
buf = &buf_d[0];
max_digits = (int)bufsiz;
if( max_digits > 50 )
max_digits = 50;
ld0 = ((long double)4) / ((long double)3); // 4/3 = 1.3333..
printf("Float bits: %3u (32 x %.1f)\n", (unsigned int)sizeof(float)*8, ((float)sizeof(float))/4 );
printf("Double bits: %3u (32 x %.1f)\n", (unsigned int)sizeof(double)*8, ((float)sizeof(double))/4 );
printf("Long double bits: %3u (32 x %.1f)\n", (unsigned int)sizeof(long double)*8, ((float)sizeof(long double))/4 );
printf("\n");
printf("Float: %f\n", ((float)4)/((float)3) );
printf("Double: %e\n", (double)4/3 );
printf("Double .31: %.31e\n", (double)4/3 );
printf("Long double .41: %.31le\n",
(double)(((long double)4) / ((long double)3)) );
printf("ld0 = %.31le\n", (double)ld0 );
sprintf((char *)buf,"%.41le", (double)ld0 );
for(i=0; i<=max_digits && isdigit((int)*(buf+i)); i++)
;
for(; i<=(int)bufsiz && *(buf+i)=='.'; i++)
;
i0 = i;
for(; i<=max_digits && *(buf+i) == '3'; i++){
//printf("%c",*(buf+i) );
}
printf("Precision printf(): %d fraction digits\n", i-i0 );
printf("for(): %d", (int)ld0 );
sprintf((char *)buf,"%d", (int)ld0 );
ld0 = ld0 - (int)ld0;
ld0 *= 10;
printf(".");
for(i=0; i<=max_digits; i++){
printf("%d", (int)ld0 );
if( ((int)ld0) != ((int)3) )
break;
ld0 = ld0 - (int)ld0;
ld0 *= 10;
}
printf("..\n");
printf("Precision for(): %d fraction digits\n", i );
// Determine fraction digits for math.h M_PI macro
p = m_pi;
for(i=0; i<=max_digits && isdigit((int)*(p+i)); i++)
;
for(; i<=(int)bufsiz && *(p+i)=='.'; i++)
;
i0 = i;
for(; i<=max_digits && isdigit((int)*(p+i)); i++){
//printf("%c",*(p+i) );
}
printf("Precision M_PI: %d fraction digits\n", i-i0 );
return 0;
}
Kod: Markera allt
Float bits: 32 (32 x 1.0)
Double bits: 64 (32 x 2.0)
Long double bits: 96 (32 x 3.0)
Float: 1.333333
Double: 1.333333e+00
Double .31: 1.3333333333333332593184650249896e+00
Long double .41: 1.3333333333333332593184650249896e+00
ld0 = 1.3333333333333332593184650249896e+00
Precision printf(): 15 fraction digits
for(): 1.3333333333333332..
Precision for(): 15 fraction digits
Precision M_PI: 20 fraction digits
Kod: Markera allt
Float bits: 32 (32 x 1.0)
Double bits: 64 (32 x 2.0)
Long double bits: 128 (32 x 4.0)
Float: 1.333333
Double: 1.333333e+00
Double .31: 1.3333333333333332593184650249896e+00
Long double .41: 1.3333333333333332593184650249896e+00
ld0 = 1.3333333333333332593184650249896e+00
Precision printf(): 15 fraction digits
for(): 1.33333333333333333336..
Precision for(): 19 fraction digits
Precision M_PI: 20 fraction digits
Kan du testa på någon annan platform och klistra in resultatet? nyfiken på om andra platformar använder fler decimaler vid beräkning(ar).