Присвойте двойную константу переменной с плавающей точкой без предупреждения в C? - PullRequest
7 голосов
/ 30 июня 2011

В языке программирования C константа с плавающей точкой по умолчанию имеет тип double
поэтому 3.1415 является двойным типом, если только не используется суффикс 'f' или 'F' для указания типа с плавающей точкой.

Я предполагаю, const float pi = 3.1415 вызовет предупреждение, но на самом деле нет.

, когда я пробую это в gcc с -Wall:

float f = 3.1415926;  
double d = 3.1415926;  
printf("f: %f\n", f);  
printf("d: %f\n", d);  
f = 3.1415926f;  
printf("f: %f\n", f);  
int i = 3.1415926;  
printf("i: %d\n", i);  

результат:

f: 3.141593  
d: 3.141593  
f: 3.141593  
i: 3

результат (включая двойную переменную) явно теряет точность, но компилируется без предупреждения.
так что же с этим сделал компилятор? или я что-то не так понял?

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

-Wall не включает предупреждения о потере точности, усечении значений и т. Д., Поскольку эти предупреждения раздражают шум, и для их «исправления» требуется загромождать правильный код кучами уродливых приведений.Если вам нужны предупреждения такого рода, вам нужно явно их включить.

Кроме того, использование printf не имеет ничего общего с точностью фактических переменных, только точность, с которой printf печатает,по умолчанию 6 знаков после запятой.

2 голосов
/ 30 июня 2011

%f может использоваться с float и double.Если вы хотите больше точности, используйте

printf("f: %.16f",d);

И это то, что происходит под капотом:

float f = 3.1415926;  // The double 3.1415926 is truncated to float
double d = 3.1415926;  
printf("f: %f\n", f);  
printf("d: %f\n", d);  
f = 3.1415926f;       // Float is specified
printf("f: %f\n", f);  
int i = 3.1415926;    // Truncation from double to int
printf("i: %d\n", i); 
1 голос
/ 30 июня 2011

Если вы хотите получить предупреждения за это, я считаю, что -Wconversion помечает их в основной строке gcc-4.3 и более поздних версиях.

Если вы используете OS X, -Wshorten-64-to-32 помечает их вGCC от Apple, начиная с gcc-4.0.1.Однако я считаю, что clang соответствует основному поведению gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...