Ошибка точности в двойном

Большое двойное значение изменяется при печати со значениями %Lf до следующей комбинации, которая дает правильные результаты 9 цифр до десятичной точки / 6 цифр после десятичной точки, например. значения с 9 цифрами перед десятичным числом, напечатанным с помощью %Lf Ввод: 3435537287,32 Вывод: 3435537287,320000

Как только я увеличиваю цифры перед десятичным числом до 10, значения, напечатанные с помощью %Lf, добавляют значение мусора. например значения с 10 цифрами перед десятичным числом, напечатанным с помощью %Lf.

Есть ли какой-либо параметр времени компиляции для g++/xlc++, который можно использовать, чтобы значение не менялось?

:: Фрагмент кода::

double d2 =  34355372871.3487; 
double d4 =  3435537287.3487; 

printf("d2 = %lf\n", d2); 
printf("d4 = %lf\n", d4); 

Спасибо, Хадсон.


person Hudson Diniz    schedule 07.08.2013    source источник
comment
Вы можете найти floating-point-gui.de полезным   -  person Hulk    schedule 07.08.2013


Ответы (3)


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

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

person Jürgen Schwietering    schedule 07.08.2013
comment
Спасибо, но даже long double дает ту же проблему. - person Hudson Diniz; 14.08.2013
comment
@Hudson: будет, если вы не добавите L в конце постоянных значений. - person Jürgen Schwietering; 20.08.2013

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

(http://en.wikipedia.org/wiki/Double-precision_format_floating-point)

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

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

person rbelli    schedule 07.08.2013

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

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

person Hulk    schedule 07.08.2013