2012-02-23 2 views
2

Мне нужно распечатать значение поплавка с 16 значащими цифрами.C спецификатор функции printf

Прямо сейчас, когда я печатаю, он печатает

т.е. 2,555556

, когда я хочу, чтобы распечатать: +2,555555555555556 /// Всего 16 цифр

Мой Printf спецификатор в настоящее время является: "% 20.18lf"

идеи?

+8

Вы знаете, что поплавок не имеет 16 цифр точности? –

+0

Я пробовал «% .16f», и он отлично работал для числа 1.0/3.0. – Tibi

+1

@Tibi: выражение '1.0/3.0' имеет тип' double'. –

ответ

3

Если значение имеет тип float, вы, вероятно, не получите более 7 значащих цифр после десятичной точки. Если это тип double, вы можете получить около 15. В зависимости от системы long double может быть не более точным, чем double; по моему, я получаю около 17 значащих цифр после десятичной точки.

В большинстве случаев код с плавающей запятой использует тип double; float намного менее точен и часто не значительно быстрее.

Я немного удивлен, что вы получили 2.555556, а не что-то вроде 2.555555582046508789 с форматом "%20.18lf".

Кстати, l (нижний регистр L) не требуется. Формат double является "%f" и float аргументы printf продвинуты в double, так "%f" является правильным для обоих float и double. Формат для long double: "%Lf".

Вот тестовая программа, я написал:

#include <stdio.h> 
int main(void) { 
    const float f  = 23.0/9.0; 
    const double d  = 23.0/9.0; 
    const long double ld = 23.0L/9.0L; 
    printf("%20.18f\n%20.18f\n%20.18Lf\n", f, d, ld); 
    return 0; 
} 

и выход я получил на моей системе:

2.555555582046508789 
2.555555555555555358 
2.555555555555555556 
0

Следующий код работает хорошо (вы должны включить C99 в качестве %lf спецификатора не часть прежних стандартов):

#include <stdio.h> 

int main(void) 
{ 
     volatile float v = 2.555555555555556; 
     printf("%20.18lf\n", v); 
     return 0; 
} 

Печать следующее:

$ gcc -std=c99 -Wall -pedantic -o test ./test.c 
$ ./test 
2.555555582046508789 
$ 

Если значение короче, скажем, 2.5, то оно правое - с нулями - 2.500000000000000000.

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

+0

Я выяснил проблему ребята.Когда я вводил, я использовал тот же спецификатор для ввода, так что он сбой – user1050632

0

C float или double недостаточно точен, в основном вам нужна функция деления высокой точности. Вот что я написал. Это для целочисленного деления. Возможно, вам придется пересмотреть его для поплавочного разделения.

int dividend=121, divisor=9; 
int quotient,remainder; 

//first print out the number before decimal point 
quotient=dividend/divisor; 
printf("%d", quotient); 
remainder=dividend-quotient*divisor; 

//print out decimal point 
printf("."); 

int digit_num=20;//this can be any precision you want 

//second we calculate the number after decimal point 
for(int i=0;i<digit_num;i++) 
{ 
    remainder=remainder*10; 
    quotient=remainder/divisor; 
    remainder=remainder-quotient*divisor; 
    printf("%d", quotient); 
    dividend=remainder; 
} 

printf("\n"); 

printf("%d digits after decimal point has been printed out\n", digit_num); 
Смежные вопросы