Когда я изучал ответ Кассной, мне показалось подозрительным, что long double
и double
в итоге окажутся с одинаковой точностью, поэтому я немного покопался. Если я запускаю его код, скомпилированный с помощью clang, я получаю те же результаты, что и он. Однако я обнаружил, что если я указал суффикс long double
и использовал литерал для инициализации длинного двойного, это обеспечило большую точность. Вот моя версия его кода:
#include <stdio.h>
int main(int argc, char** argv)
{
long double pild = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899L;
double pid = pild;
float pif = pid;
printf("%s\n%1.80f\n%1.80f\n%1.80Lf\n",
"3.14159265358979323846264338327950288419716939937510582097494459230781640628620899",
pif, pid, pild);
return 0;
}
И результаты:
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
^
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000
^
3.14159265358979323851280895940618620443274267017841339111328125000000000000000000
^