Погрешность точности в двойном

Большое двойное значение изменяется при печати с% 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);

Спасибо,
Гудзон

0

Решение

Это точность двойника. Двойник хранится с 64 битами (8 байт).

(http://en.wikipedia.org/wiki/Double-precision_floating-point_format)

Он использует 52 бита для мантиссы, 1 бит для сигнала и 11 бит для показателя степени.

Затем 52-битная мантисса дает точность 15–17 значащих десятичных цифр.

1

Другие решения

Краткое объяснение: вам нужны длинные пары

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 цифр.

1

Из-за ограниченной точности чисел с плавающей запятой не все (или фактически только несколько) десятичных литералов с плавающей запятой точно соответствуют существующему двоичному представлению.

Каждый литерал сопоставляется с ближайшим существующим значением. Это происходит для каждого типа с плавающей запятой, но это будет менее заметно для типов с более высокой точностью, потому что есть более четкие числа.

0
По вопросам рекламы [email protected]