W języku programowania C stała zmiennoprzecinkowa jest domyślnie typu podwójnego
, więc 3.1415
jest typu podwójnego, chyba że używa sufiksu "f" lub "F" do wskazania typu pływaka.Przypisz podwójną stałą do zmiennoprzecinkowej bez ostrzeżenia w C?
Zakładam, że const float pi = 3.1415
spowoduje ostrzeżenie, ale w rzeczywistości nie.
gdy próbuję je pod gcc z -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);
wynik jest:
f: 3.141593
d: 3.141593
f: 3.141593
i: 3
wynik (w tym podwójnego zmiennej) oczywiście utratę precyzji, ale kompilacji bez żadnego ostrzeżenia.
więc co zrobił kompilator z tym? czy coś źle zrozumiałem?
Wariantowa natura 'printf' zapewnia, że przepływy są niejawnie rzutowane na podwójne, gdy są przekazywane? –
Tak, chociaż jest to raczej niezwiązane z pytaniem OP. –
Zastanawiam się, która z nich jest większa: liczba błędów, które przechwytuje komunikat "możliwa utrata precyzji z double to float", lub liczba błędów, które wynikają z kodu programisty, który musi wyraźnie zmusić wiele rzeczy do 'float' do zrobienia kompilator szczęśliwy, także zmusza do "unoszenia" czegoś, co nie powinno być [np 'const float oneTenth = 1.0f/10.0f; wartość pływająca1 = 8,0 f * jedennasta; double value2 = 4.0f * oneThoth; 'Zauważ, że gdyby' onethenth' mogło być "double", wszystko by działało idealnie. – supercat