Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/107: Рейтинг темы: голосов - 107, средняя оценка - 4.63
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
1

округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );

15.11.2011, 12:30. Показов 20858. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
printf("%.4f", (float) ans );
printf("%.4lf", ans );
вроде по моему пониманию мы должны на выходе получать одно и то же (анс в начале дабл).
но т.к. это олимпиада протестил 1 и 2 вариант, 2 дал 100 баллов, 1 24 балла, не понимаю где так жестоко косится ответ.
P.S. задача вывести с точностью 4 знака опр число, которое рассчитывается до этого.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2011, 12:30
Ответы с готовыми решениями:

Объясните зачем в printf писать %5.2lf или %8.4lf
Здравствуйте, объясните мне пожалуйста зачем в printf писать %5.2lf или %8.4lf. И почему эти числа,...

Проблема [C++ Error] Unit1.cpp(48): E2238 Multiple declaration for 'ans'
Никак не могу понять в чем ошибка .cpp: ...

На что ругается программа? [Error] Unit1.pas(804): Identifier redeclared: 'Ans'
Взяла код из другой программы, там всё хорошо работало, а тут ошибку выдает: Unit1.pas(804):...

printf. Округление чисел типа double
Пытаюсь писать программу для округления чисел типа double. // okruglenie double.cpp: определяет...

Ошибка - Warning: printf() [function.printf]: Too few arguments
привет всем. создал форму вывода данных из таблицы: <?php $result3 = mysql_query("select img,...

30
Заблокирован
Автор FAQ
15.11.2011, 15:29 21
Author24 — интернет-сервис помощи студентам
Evg, спасибо теперь мне стало ясней
Цитата Сообщение от AC-93 Посмотреть сообщение
Плз не отходите от темы, я не хотел отвлекать задачей и условием. 2 строчки два принтфа, все.
- получается что разницы нет
printf("%.4f", (float) ans ); и printf("%.4lf", ans );, дайте пожалуйста для анализа исходные данные при которых у вас не работало!
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2011, 15:34 22
Возьмём такой пример:

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
double D = 1.234567891234567812345678;
 
int main (void)
{
  printf ("%.90f\n", (double)(float)D);
  printf ("%.90f\n", D);
  printf ("%.90lf\n", D);
  return 0;
}
На печать выведется:

Код
1.234567880630493164062500000000000000000000000000000000000000000000000000000000000000000000
1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000
1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000
Таким образом в ссылке из поста 10 либо врут, либо glibc (с которой линковался данный пример) работает не по стандарту. Потому что тут явно видно, что "f" ну никак не пытается привести аргумент к типу float (2-ой printf), потому что в этом случае мы бы увидели на печати то, что выдал 1-й printf.

Добавлено через 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
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2011, 15:43 24
2-ю или 3-ю строку надо заменить на "%lf", а то они полностью одинаковые
0
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:45  [ТС] 25
но на scanf
scanf("%lf", &ans);
scanf("%f", &ans);
абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
0
Заблокирован
Автор FAQ
15.11.2011, 16:28 26
Цитата Сообщение от AC-93 Посмотреть сообщение
не странно ли?
- поэтому я и писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Всю жизнь работал с lf для дабла f для float и тут такое
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
почему нет разницы между f и lf я просто в ступоре от
У меня реально мировоззрение крах потерпело!
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2011, 16:32 27
Цитата Сообщение от AC-93 Посмотреть сообщение
но на scanf
scanf("%lf", &ans);
scanf("%f", &ans);
абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
Нет, не странно. В 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
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
DKOI, я приношу вам свои извинения!
-=ЮрА=-, Ничего страшного Я сам удивился, когда прочитал об этом, кстати на том же сайте, что и вы

Цитата Сообщение от Evg Посмотреть сообщение
И тут действительно "f" означает float, а "lf" - double. Так что товарищи по ссылке из поста 10 накосячили. Оно посчитали, что printf и scanf сделаны полностью симметрично. Ан нет
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
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2011, 18:39 29
Мда... не заметил
0
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

Не по теме:

Цитата Сообщение от DKOI Посмотреть сообщение
Thus %f and %lf are quite different in scanf, but the same in printf.
исчерпывающе!:good:

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2011, 18:46

Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76
Помогите связать бд с сайтом я новичок в этом вот код php &lt;?php do { printf(&quot;&lt;div...

Напечатать float через printf
Здравствуйте, не могу найти пример в интернете как выводить float через printf в GAS. Следующий...

не работает printf для float
Почти день убил на то, чтобы исправить проблему, но не получилось. Использую STM32F4Dyscovery и...

Warning: printf() [function.printf]: Too few arguments
Не Могу вывести цикл из базы дает такие ошибки Warning: printf() : Too few arguments in...

Ошьібка Warning: printf() [function.printf]
Вьідает ошьібку Warning: printf() : Too few arguments in /home/u500421749/public_html/index.php on...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru