2013-08-07 3 views
0

Значительное двойное значение изменяется при печати с помощью% 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

Вы можете найти http://floating-point-gui.de/ help – Hulk

ответ

1

Это точность двойной. Двойной хранится с 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 бит (лог (10)/LOG (2)) так 52bits/3,3 ~ 15-16 цифр.

+0

Спасибо, но даже длинный двойной дает ту же проблему. –

+0

@Hudson: он будет, если вы не добавите L в конце постоянных значений. –

0

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

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

Смежные вопросы