Большое двойное значение изменяется при печати с% Lf
Значения до следующей комбинации дают надлежащие результаты
9 цифр до запятой / 6 цифр после запятой
например значения с 9 цифрами до запятой, напечатанного с% Lf
Ввод: 3435537287.32
Выход: 3435537287.320000
Как только я увеличу цифры до десятичного числа до 10, значения, напечатанные с помощью% Lf, добавят значение мусора.
например значения с 10 цифрами до запятой, напечатанного с% Lf
Ввод: 34355372871.3487
Выход: 34355372871.348701
Как видно из вышеприведенного вывода, входное значение изменяется.
Есть ли какая-либо опция времени компиляции для g ++ / xlc ++, которую можно использовать, чтобы значение не менялось?
:: Фрагмент кода ::
double d2 = 34355372871.3487;
double d4 = 3435537287.3487;
printf("d2 = %lf\n", d2);
printf("d4 = %lf\n", d4);
Спасибо,
Гудзон
Это точность двойника. Двойник хранится с 64 битами (8 байт).
(http://en.wikipedia.org/wiki/Double-precision_floating-point_format)
Он использует 52 бита для мантиссы, 1 бит для сигнала и 11 бит для показателя степени.
Затем 52-битная мантисса дает точность 15–17 значащих десятичных цифр.
Краткое объяснение: вам нужны длинные пары
long double d2 = 34355372871.3487L;
long double d4 = 3435537287.3487L;
printf("d2 = %Lf\n", d2);
printf("d4 = %Lf\n", d4);
длинное объяснение: ваше значение занимает много места 😉
Вот биты, используемые в значении с плавающей точкой.
//Type Sign Exponent Significand Total bit
//Double 1 11 52 64
//Long Double 1 15 64 80
Помните, что каждая десятичная цифра занимает около 3,3 бита (log (10) / log (2))
итак 52 бит / 3,3 ~ 15-16 цифр.
Из-за ограниченной точности чисел с плавающей запятой не все (или фактически только несколько) десятичных литералов с плавающей запятой точно соответствуют существующему двоичному представлению.
Каждый литерал сопоставляется с ближайшим существующим значением. Это происходит для каждого типа с плавающей запятой, но это будет менее заметно для типов с более высокой точностью, потому что есть более четкие числа.