Проблемы с печатью float64 значение в C - PullRequest
2 голосов
/ 19 февраля 2020

Я прошу прощения за любое недопонимание здесь с типами данных или способом C (я все еще относительно новичок в изучении). Может кто-нибудь объяснить мне, почему я не могу получить желаемый вывод (см. Ниже)?

#include<stdio.h>
#include<math.h>

#define size         10

typedef unsigned int      Uint16;

typedef long double        float64;


Uint16 i;


float64 normalization = 0;

void main() {

  for (i=0;i<size;i++)
  {
     normalization = normalization + i;    // same as "normalization += i;"

     printf("\n --------");
     printf("\n normalization %f", normalization);

  }

  return;
}

Вывод на консоль следующий:

 --------
 normalization 0.000000
 --------
 normalization -0.000000
 --------
 normalization -2.000000
 --------
 normalization -2.000000
 --------
 normalization -0.000000
 --------
 normalization -3105036184601417900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
 --------
 normalization -0.000000
 --------
 normalization -26815615859885194000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
 --------
 normalization -0.000000
 --------
 normalization -0.000000

Я ожидаю, что вывод быть:

normalization = 0
normalization = 1
normalization = 3
normalization = 6
normalization = 10
normalization = 15
// and so forth...

Ответы [ 2 ]

6 голосов
/ 19 февраля 2020

Проблема здесь заключается в несовпадении спецификатора формата и типа аргумента, что приводит к неопределенному поведению .

Формат %f (а также %lf) предназначен для простого double , а не long double.

Для long double необходимо использовать префикс printf L для формата, как в %Lf:

printf("normalization %Lf\n", normalization);

На несвязанной ноте, пожалуйста, сделайте привычкой иметь в своем выводе завершающие переводы строки. Поскольку вывод в stdout (в который записывается printf) по умолчанию равен , строка буферизована, ведущий символ новой строки может привести к неожиданному «отсутствующему» выводу.

5 голосов
/ 19 февраля 2020

A long double не может быть напечатано с %f. Вместо этого используйте double, который будет работать со спецификатором формата printf %f.

В качестве альтернативы, если вы действительно хотите использовать long double, вы можете использовать %Lf (чувствительно к регистру), чтобы напечатать его.

Если вы специально хотите, чтобы вывод, указанный вами, без конечных нулей, вам придется использовать %g (для double) или %Lg (для long double ; с учетом регистра).

Также обратите внимание, что long double не всегда имеет ширину 64 бита, а unsigned int не всегда имеет ширину 16 бит. Гораздо лучшая идея, чем использование float64 и Uint16, заключается в простом использовании типов без typedef s, поскольку вы не должны предполагать ширину типов.

...