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).