18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
|
|
1 | |
округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );15.11.2011, 12:30. Показов 20858. Ответов 30
Метки нет (Все метки)
printf("%.4f", (float) ans );
printf("%.4lf", ans ); вроде по моему пониманию мы должны на выходе получать одно и то же (анс в начале дабл). но т.к. это олимпиада протестил 1 и 2 вариант, 2 дал 100 баллов, 1 24 балла, не понимаю где так жестоко косится ответ. P.S. задача вывести с точностью 4 знака опр число, которое рассчитывается до этого.
0
|
15.11.2011, 12:30 | |
Ответы с готовыми решениями:
30
Объясните зачем в printf писать %5.2lf или %8.4lf Проблема [C++ Error] Unit1.cpp(48): E2238 Multiple declaration for 'ans' На что ругается программа? [Error] Unit1.pas(804): Identifier redeclared: 'Ans' printf. Округление чисел типа double Ошибка - Warning: printf() [function.printf]: Too few arguments |
15.11.2011, 15:34 | 22 | |||||
Возьмём такой пример:
Код
1.234567880630493164062500000000000000000000000000000000000000000000000000000000000000000000 1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000 1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000 Добавлено через 47 секунд И сентенция такая, что "%f" отрабатывает так же, как и "%lf"
2
|
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
|
|
15.11.2011, 15:41 [ТС] | 23 |
ans = 0.009450;
printf("\n%.4lf", ans ); printf("\n%.4f", (float)ans ); printf("\n%.4lf", (float)ans ); printf("\n%.4f", ans ); получаем 0.0095 0.0094 0.0094 0.0095
0
|
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
|
|
15.11.2011, 15:45 [ТС] | 25 |
но на scanf
scanf("%lf", &ans); scanf("%f", &ans); абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
0
|
15.11.2011, 16:32 | 27 |
Нет, не странно. В scanf передаётся указатель в отличие от printf'а, а потому никакого promotion'а нет. Т.е. в случае printf'а нет физической возможности дотащить значение типа float до самого printf'а, потому что в момент передачи он будет расширен до double'а. А указатель он и есть указатель
http://linux.die.net/man/3/scanf И тут действительно "f" означает float, а "lf" - double. Так что товарищи по ссылке из поста 10 накосячили. Оно посчитали, что printf и scanf сделаны полностью симметрично. Ан нет
1
|
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
|
|
15.11.2011, 18:36 | 28 |
-=ЮрА=-, Ничего страшного Я сам удивился, когда прочитал об этом, кстати на том же сайте, что и вы
Footnote: In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double. Thus in printf() there is no difference between %f and %lf, or between %g and %lg. However, in scanf() what is passed is a pointer to the variable so no rvalue type promotions occur or are expected. Thus %f and %lf are quite different in scanf, but the same in printf.
1
|
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
|
|
15.11.2011, 18:42 | 30 |
Ничего Со всеми бывает
0
|
|
15.11.2011, 18:46
округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
#31
|
0
|
15.11.2011, 18:46 | |
Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76 Напечатать float через printf не работает printf для float Warning: printf() [function.printf]: Too few arguments Ошьібка Warning: printf() [function.printf] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |