Как установить точность поплавка - PullRequest
13 голосов
/ 09 февраля 2012

Может кто-нибудь объяснить мне, как выбрать точность с плавающей точкой с функцией C?

Примеры:

theFatFunction(0.666666666, 3) возвращает 0,667

theFatFunction(0.111111111, 3) возвращает 0,111

Ответы [ 5 ]

13 голосов
/ 09 февраля 2012

Вы не можете сделать это, так как точность определяется типом данных (т.е. float или double или long double). Если вы хотите округлить его для печати, вы можете использовать соответствующие спецификаторы формата в printf(), т.е. printf("%0.3f\n", 0.666666666).

2 голосов
/ 09 февраля 2012

Поплавки имеют статическую фиксированную точность. Вы не можете это изменить. То, что вы иногда можете сделать, это округлить число.

См. эту страницу и подумайте о том, чтобы масштабировать себя до степени 10. Обратите внимание, что не все числа также могут быть точно представлены как числа с плавающей точкой.

2 голосов
/ 09 февраля 2012

Вы не можете.Точность полностью зависит от типа данных.У вас есть float и double и все.

1 голос
/ 09 февраля 2012

Большинство систем следуют стандарту IEEE-754, который определяет несколько типов с плавающей запятой.

В этих системах обычно float - это тип IEEE-754 binary32 с одинарной точностью: он имеет 24-разрядный тип.точности.double - тип binary64 двойной точности;он имеет 53-битную точность.Точность в битовых числах определяется стандартом IEEE-754 и не может быть изменена.

При печати значений типов с плавающей запятой с использованием функций семейства fprintf (например, printf) точностьопределяется как максимальное количество значащих цифр и по умолчанию установлено в 6 цифр.Вы можете изменить точность по умолчанию с помощью ., за которым следует десятичное число в спецификации преобразования.Например:

printf("%.10f\n", 4.0 * atan(1.0));  // prints 3.1415926536

, тогда как

printf("%f\n", 4.0 * atan(1.0));     // prints 3.141593
0 голосов
/ 06 августа 2015

Точность определяется типом данных (т. Е. С плавающей или двойной или длинной двойной).

Если вы хотите округлить его в целях печати, вы можете использовать соответствующие спецификаторы формата в printf (), т.е.

printf("%0.3f\n", 0.666666666)  //will print 0.667 in c

Теперь, если вы хотите округлить его для целей расчета, вы должны сначала умножить число с плавающей запятой на 10 ^ цифр, затем выполнить приведение к int, выполнить вычисление, а затем снова выполнить приведение к вычислению и разделить на ту же степень10

float f=0.66666; 
f *= 1000;  // 666.660
int i = (int)f; // 666
i = 2*i;  //  1332
f = i;   //  1332
f /= 1000;  // 1.332
printf("%f",f);  //1.332000
...